shhh <- suppressPackageStartupMessages # It's a library, so shhh!

shhh(library( mgcv ))
shhh(library(dplyr))
shhh(library(ggplot2))
shhh(library(lme4))
shhh(library(tidymv))
shhh(library(gamlss))
shhh(library(gsubfn))
shhh(library(lmerTest))
shhh(library(tidyverse))
shhh(library(boot))
shhh(library(rsample))
shhh(library(plotrix))
shhh(library(ggrepel))
shhh(library(mgcv))

shhh(library(brms))
shhh(library(bayesplot))
shhh(library(patchwork))
shhh(library(MASS))
shhh(library(tidyr))
shhh(library(extraDistr))
shhh(library(purrr))
# For exercises with Stan code
shhh(library(rstan))
options(mc.cores = parallel::detectCores())
rstan_options(auto_write = FALSE)

library(car)
library(coda)
shhh(library(gridExtra))

theme_set(theme_bw())
options(digits=4)
options(scipen=999)
set.seed(444)
pipe_message = function(.data, status) {message(status); .data}

Read in MoTR Data


rate = 160

file_prefix = "../reading_measures/provo/provo_f160/"
fnames = list.files(path=file_prefix)

df = data.frame()
for (f in fnames) {
  temp = read.csv(paste0(file_prefix, "/", f)) %>%
    mutate(subj = str_remove(f, "_reading_measures.csv"))
  df = rbind(df, temp)
}

# Filter out readers who don't answer the comprehension questions correctly
filter_df = df %>%
  group_by(para_nr, subj) %>% summarise(correct = if_else(unique(correctness) == 1, 1, 0)) %>% ungroup() %>%
  drop_na() %>%
  group_by(subj) %>% summarise(p_correct = mean(correct)) %>% ungroup() %>%
  mutate(p_correct = round(p_correct, digits = 2))
`summarise()` has grouped output by 'para_nr'. You can override using the `.groups` argument.
filter_df = filter_df %>% filter(p_correct < 0.8)
filter_list = filter_df$subj
## reader_3:0.70, reader_60:0.79, reader_76:0.72 , reader_256:0.71 , reader_262:0.57 

raw_df = df %>%
  filter(! subj %in% c(filter_list)) %>%
  mutate(word = str_trim(word)) %>%
  mutate(subj = str_remove(subj, "reader_")) %>%
  mutate(subj = as.character(subj)) %>%
  # filter(! subj %in% c("3", "60", "76", "256", "262")) %>% # Explanation for this filtering
  mutate(FPReg = if_else(total_duration == 0, -1, FPReg)) %>% #If the word is skipped we can't say that it wasn't regressed on the first pass. Set to a "NA"
  dplyr::select(expr_id, cond_id, para_nr, word, word_nr, first_duration, total_duration, gaze_duration, go_past_time, FPReg, subj)

length(unique(raw_df$subj))
[1] 46
df %>%
  filter(! subj %in% c(filter_list)) %>%
  filter(FPReg >= 0) %>%
  dplyr::select(FPReg) %>%
  drop_na() %>%
  summarise( m = mean(FPReg))

df %>%
  filter(! subj %in% c(filter_list)) %>%
  dplyr::select(FPFix) %>%
  drop_na() %>%
  summarise( m = mean(FPFix))
NA
NA
# Average across subjects
motr_agg_df = raw_df %>%
  gather(metric, value, 6:10) %>%
    filter(value >= 0) %>% #Removes the "NA" values for FPReg
  
    # ==== Remove skipped words
    # mutate(zero = if_else(metric != "FPReg" & value == 0,T, F)) %>%
    # filter(zero == F) %>%
  
    drop_na() %>%
    group_by(para_nr, word_nr, word, metric) %>% 
      mutate(outlier = if_else(metric != "FPReg" & value > (mean(value) + 3 * sd(value)), T, F)) %>% filter(outlier == F) %>%
      summarise(value = mean(value), nsubj = length(unique(subj))) %>%
  ungroup() %>%
  arrange(para_nr, word_nr) %>%
  rename(text_id = para_nr, word_text_idx = word_nr, motr_value = value)
`summarise()` has grouped output by 'para_nr', 'word_nr', 'word'. You can override using the `.groups` argument.
# View(motr_agg_df)
# write.csv(motr_agg_df, file = "/Users/cui/Desktop/MoTR/pipeline/ancillary_data/motr_agg_df.csv", row.names = FALSE)

Comparison to Provo

# Read in Provo surprisal, frequency and length data
provo_modeling_df = read.csv("../ancillary_data/provo_df.csv") %>%
  dplyr::select(text_id, sent_id, trigger_idx, word, freq, surp, len) %>%
  rename(word_idx = trigger_idx)

provo_modeling_df
# View(provo_modeling_df)
# Read in Provo eyetracking data

provo_raw_df = read.csv("../ancillary_data/provo_eyetracking.csv")

# unique(provo_raw_df$Participant_ID)
# length(unique(provo_raw_df$Participant_ID))

provo_eyetracking_df = provo_raw_df %>%
  dplyr::select(Participant_ID, Text_ID, Sentence_Number, Word_In_Sentence_Number, Word, Word_Number, IA_FIRST_FIX_PROGRESSIVE, IA_FIRST_RUN_DWELL_TIME, IA_DWELL_TIME, IA_REGRESSION_PATH_DURATION, IA_REGRESSION_OUT, IA_SKIP) %>%
  rename( #first_duration = IA_FIRST_FIXATION_DURATION,   
          gaze_duration = IA_FIRST_RUN_DWELL_TIME,
          total_duration = IA_DWELL_TIME,
          go_past_time = IA_REGRESSION_PATH_DURATION,
          subj = Participant_ID,
          text_id = Text_ID,
          sent_id = Sentence_Number,
          word_idx = Word_In_Sentence_Number,
          word_text_idx = Word_Number,   # IA_ID?
          word = Word,      # Word?
          FPReg = IA_REGRESSION_OUT,
          skip = IA_SKIP,
          ff_progressive = IA_FIRST_FIX_PROGRESSIVE) %>%
  mutate(first_duration = gaze_duration) %>%
  mutate(gaze_duration = if_else(ff_progressive == 0, 0, as.double(gaze_duration)),
         go_past_time = if_else(ff_progressive == 0, 0, as.double(go_past_time))) %>%
  dplyr::select(-ff_progressive) %>%
  
  mutate(
    gaze_duration = if_else(total_duration == 0, 0, as.double(gaze_duration)),
      go_past_time = if_else(total_duration == 0, 0, as.double(go_past_time)),
      FPReg = if_else(total_duration == 0, -1, as.double(FPReg)),
      first_duration =  if_else(total_duration == 0, 0, as.double(first_duration)),
  ) %>%
  
  # drop_na() %>%     # will drop the whole row with all the metrics
  gather(metric, value, 7:12) %>%
  filter(value >= 0) %>%          # filter skipped word in eye tracking data for FPReg
  # ==== Remove skipped words
  # mutate(zero = if_else(metric != "FPReg" & value == 0,T, F)) %>%
  # filter(zero == F) %>%
  
  # mutate(value = if_else(is.na(value), as.integer(0), as.integer(value))) %>%
  # mutate(value = if_else(metric != "FPReg" & is.na(value), as.integer(0), as.integer(value))) %>%
  drop_na() %>%
  mutate(word = str_trim(word)) %>%
  mutate(subj = str_remove(subj, "Sub")) %>%
  mutate(subj = as.integer(subj)) %>%
    group_by(text_id, word_text_idx, sent_id, word_idx, word, metric) %>%
    mutate(outlier = if_else(metric != "FPReg" & metric != "skip" & value > (mean(value) + 3 * sd(value) ), T, F)) %>%
    filter(outlier == F) %>%
  ungroup() #%>%

# Aggregate cross-participant data for all subjects
provo_eyetracking_agg_df = provo_eyetracking_df %>%
  group_by(text_id, word_text_idx, sent_id, word_idx, word, metric) %>%
    summarise(value = mean(value),
              nsubj = length(unique(subj))) %>%
    ungroup()
`summarise()` has grouped output by 'text_id', 'word_text_idx', 'sent_id', 'word_idx', 'word'. You can override using the `.groups` argument.
# View(provo_eyetracking_df)

# View(provo_eyetracking_agg_df)
# write.csv(provo_eyetracking_agg_df, file = "/Users/cui/Desktop/MoTR/pipeline/ancillary_data/provo_eyetracking_agg_df.csv", row.names = FALSE)

provo_raw_df %>%
  dplyr::select(IA_REGRESSION_OUT) %>%
  drop_na() %>%
  summarise( m = mean(IA_REGRESSION_OUT))

provo_raw_df %>%
  dplyr::select(IA_SKIP) %>%
  drop_na() %>%
  summarise( m = mean(IA_SKIP))
NA
NA

# Split the eyetracking data in two by subjects to see how well it correlates with itself
provo_eyetracking_subj1_df_temp = provo_eyetracking_df %>%
  filter(subj <= 42) %>%
  mutate(word_text_idx = as.integer(word_text_idx - 1)) %>%
  group_by(text_id, word_text_idx, sent_id, word_idx, word, metric) %>%
    summarise(value = mean(value)) %>%
  ungroup() %>%
  rename(value_1 = value) #%>%
`summarise()` has grouped output by 'text_id', 'word_text_idx', 'sent_id', 'word_idx', 'word'. You can override using the `.groups` argument.
  # dplyr::select(-sent_id, -word_idx)

# View(provo_eyetracking_subj1_df_temp)

provo_eyetracking_subj1_df = merge(provo_eyetracking_subj1_df_temp, motr_agg_df, by=c("text_id", "word_text_idx", "metric")) %>%
  arrange(text_id, sent_id, word_idx) %>%
  filter(!(text_id == 13 & word_text_idx >= 20 & word_text_idx <= 52)) %>%
  filter(!(text_id == 3 & word_text_idx >= 46 & word_text_idx <= 57)) %>%
  rename(word = word.y) %>%
  dplyr::select(text_id, word_text_idx, metric, word, value_1)

# View(provo_eyetracking_subj1_df)

provo_eyetracking_subj2_df = provo_eyetracking_df %>%
  filter(subj > 42) %>%
  mutate(word_text_idx = as.integer(word_text_idx - 1)) %>%
  group_by(text_id, word_text_idx, sent_id, word_idx, word, metric) %>%
    summarise(value = mean(value)) %>%
  ungroup() %>%
    rename(value_2 = value)%>%
  dplyr::select(-sent_id, -word_idx)
`summarise()` has grouped output by 'text_id', 'word_text_idx', 'sent_id', 'word_idx', 'word'. You can override using the `.groups` argument.
# View(provo_eyetracking_subj2_df)
  
provo_eyetr_grouped_df = merge(provo_eyetracking_subj2_df, provo_eyetracking_subj1_df, by=c("text_id", "word_text_idx", "metric")) %>%
  # filter(word.x == word.y) %>%
  dplyr::select(-word.y) %>%
  group_by(metric) %>%
    mutate(motr_outlier = if_else(metric != "FPReg" & metric != "skip" & value_1 > (mean(value_1) + 3 * sd(value_1) ), T, F)) %>%
    filter(motr_outlier == F) %>%
    mutate(eyetr_outlier = if_else(metric != "FPReg" & metric != "skip" & value_2 > (mean(value_2) + 3 * sd(value_2) ), T, F)) %>%
    filter(eyetr_outlier == F) %>%
  ungroup() %>%
  gather(measure, value, c("value_1", "value_2")) %>%
  dplyr::select(-motr_outlier, -eyetr_outlier)

# View(provo_eyetr_grouped_df)
provo_df = merge(provo_eyetracking_agg_df, provo_modeling_df, by=c("text_id", "sent_id", "word_idx")) %>%
  mutate(word_text_idx = as.integer(word_text_idx - 1)) %>%
  arrange(text_id, sent_id, word_idx) %>%
  rename(eyetr_value = value) 

provo_df = merge(provo_df, motr_agg_df, by=c("text_id", "word_text_idx", "metric")) %>%
arrange(text_id, sent_id, word_idx) %>%
  # almost all the word.x != word.y is because of normalization problem, so we can keep them, instead, deleting some special cases
filter(!(text_id == 13 & word_text_idx >= 20 & word_text_idx <= 52)) %>%
  filter(!(text_id == 3 & word_text_idx >= 46 & word_text_idx <= 57)) %>%
# filter(word.x == word) #%>%
dplyr::select(-word.x, -word.y) %>%
group_by(metric) %>%
  mutate(motr_outlier = if_else(metric != "FPReg" & motr_value > (mean(motr_value) + 3 * sd(motr_value) ), T, F)) %>%
  filter(motr_outlier == F) %>%
  mutate(eyetr_outlier = if_else(metric != "FPReg" & eyetr_value > (mean(eyetr_value) + 3 * sd(eyetr_value) ), T, F)) %>%
  filter(eyetr_outlier == F) %>%
ungroup() %>%
gather(measure, value, c("eyetr_value", "motr_value")) %>%
dplyr::select(-motr_outlier, -eyetr_outlier)
  
# View(provo_df)
# provo_df

Bayesian – use Stan – motr & eyetr correlation

print("Gaze Duration")
[1] "Gaze Duration"
gd_df = provo_df %>% filter(metric == "gaze_duration") %>% 
  spread(measure, value) %>%
  # smoothing, if includes 0s
  mutate(eyetr_value =  pmax(eyetr_value, 1),
         motr_value = pmax(motr_value, 1)
  ) %>%
  mutate(eyetr_value_log = log(eyetr_value),
         motr_value_log = log(motr_value))
print(cor.test(gd_df$eyetr_value, gd_df$motr_value)$estimate)
   cor 
0.7874 
print(cor.test(gd_df$eyetr_value_log, gd_df$motr_value_log)$estimate)
   cor 
0.6055 
# View(gd_df)
gd_df %>% 
  gather(measure, value, 12:15) %>%
  ggplot(aes(x = value)) +
  geom_density() +
  facet_wrap(~measure, scales = "free") +
  theme_bw() +
  scale_fill_brewer(palette = "Set1")

NA
# center data around 0.

gd_temp <- gd_df[c("eyetr_value", "motr_value")] %>%
   # mutate(eyetr_value = eyetr_value - mean(eyetr_value),
   #      motr_value = motr_value - mean(motr_value)) %>%
  data.matrix()

gd_temp_log <- gd_df[c("eyetr_value_log", "motr_value_log")] %>%
 mutate(eyetr_value_log = eyetr_value_log - mean(eyetr_value_log), 
        motr_value_log = motr_value_log - mean(motr_value_log)) %>%
  data.matrix()

# Set up the plotting area with two side-by-side plots
par(mfrow = c(1, 2))
# Plot the first data matrix gd_temp
plot(gd_temp, pch = 16, col = "blue",
     main = "Not Log-Transformed")
# Plot the second data matrix gd_temp_log
plot(gd_temp_log, pch = 16, col = "red",
     main = "Centered Log-Transformed")

gd_data = list(x=gd_temp, N=nrow(gd_temp))

fit_gd = stan(
  file="stan_models/bivariate_correlation.stan", 
  data=gd_data, 
  iter=4000, 
  chains=4, 
  cores=8,
  seed=444,
  # control=list(adapt_delta=0.99), 
  verbose = FALSE
  )

# Save the model 
fit_gd@stanmodel@dso <- new("cxxdso")
saveRDS(fit_gd, file = paste0("motr_eyetr_gaze_duration_cor_drop0s.rds"))
print("Go Past Time")
[1] "Go Past Time"
gpt_df = provo_df %>% filter(metric == "go_past_time") %>% 
  spread(measure, value) %>%
  # smoothing, if includes 0s
  mutate(eyetr_value =  pmax(eyetr_value, 1),
         motr_value = pmax(motr_value, 1)
  ) %>%
  mutate(eyetr_value_log = log(eyetr_value),
         motr_value_log = log(motr_value))
print(cor.test(gpt_df$eyetr_value, gpt_df$motr_value)$estimate)
   cor 
0.7292 
print(cor.test(gpt_df$eyetr_value_log, gpt_df$motr_value_log)$estimate)
   cor 
0.5889 
gpt_df %>% 
  gather(measure, value, 12:15) %>%
  ggplot(aes(x = value)) +
  geom_density() +
  facet_wrap(~measure, scales = "free") +
  theme_bw() +
  scale_fill_brewer(palette = "Set1")

gpt_temp <- gpt_df[c("eyetr_value", "motr_value")] %>% data.matrix()

gpt_temp_log <- gpt_df[c("eyetr_value_log", "motr_value_log")] %>%
 mutate(eyetr_value_log = eyetr_value_log - mean(eyetr_value_log), 
        motr_value_log = motr_value_log - mean(motr_value_log)) %>%
  data.matrix()

# Set up the plotting area with two side-by-side plots
par(mfrow = c(1, 2))

# Plot the first data matrix gpt_temp
plot(gpt_temp, pch = 16, col = "blue",
     main = "Not Log-Transformed")
# Plot the second data matrix gpt_temp_log
plot(gpt_temp_log, pch = 16, col = "red",
     main = "Centered Log-Transformed")

# -------fit model go past time ----------
gpt_data = list(x=gpt_temp, N=nrow(gpt_temp))
fit_gpt = stan(
  file="stan_models/bivariate_correlation.stan", 
  data=gpt_data, 
  iter=4000, 
  chains=4, 
  cores=8,
  seed=444,
  # control=list(adapt_delta=0.99), 
  verbose = FALSE
  )

# Save the model 
fit_gpt@stanmodel@dso <- new("cxxdso")
saveRDS(fit_gpt, file = paste0("motr_eyetr_go_past_time_cor_drop0s.rds"))
print("Total Duration")
[1] "Total Duration"
td_df = provo_df %>% filter(metric == "total_duration") %>% 
  spread(measure, value) %>%
  # smoothing, if includes 0s
  mutate(eyetr_value =  pmax(eyetr_value, 1),
         motr_value = pmax(motr_value, 1)
  ) %>%
  mutate(eyetr_value_log = log(eyetr_value),
         motr_value_log = log(motr_value))
print(cor.test(td_df$eyetr_value, td_df$motr_value)$estimate)
   cor 
0.7601 
print(cor.test(td_df$eyetr_value_log, td_df$motr_value_log)$estimate)
   cor 
0.6421 
td_df %>% 
  gather(measure, value, 12:15) %>%
  ggplot(aes(x = value)) +
  geom_density() +
  facet_wrap(~measure, scales = "free") +
  theme_bw() +
  scale_fill_brewer(palette = "Set1")

td_temp <- td_df[c("eyetr_value", "motr_value")] %>% data.matrix()

td_temp_log <- td_df[c("eyetr_value_log", "motr_value_log")] %>%
 mutate(eyetr_value_log = eyetr_value_log - mean(eyetr_value_log), 
        motr_value_log = motr_value_log - mean(motr_value_log)) %>%
  data.matrix()

# Set up the plotting area with two side-by-side plots
par(mfrow = c(1, 2))

# Plot the first data matrix td_temp
plot(td_temp, pch = 16, col = "blue",
     main = "Not Log-Transformed")
# Plot the second data matrix td_temp_log
plot(td_temp_log, pch = 16, col = "red",
     main = "Centered Log-Transformed")

# -------fit model total duration ----------
td_data = list(x=td_temp, N=nrow(td_temp))
fit_td = stan(
  file="stan_models/bivariate_correlation.stan", 
  data=td_data, 
  iter=4000, 
  chains=4, 
  cores=8,
  seed=444,
  # control=list(adapt_delta=0.99), 
  verbose = FALSE
  )

# Save the model 
fit_td@stanmodel@dso <- new("cxxdso")
saveRDS(fit_td, file = paste0("motr_eyetr_total_duration_cor.rds"))
print("First Pass Regression Prob.")
[1] "First Pass Regression Prob."
reg_df = provo_df %>% filter(metric == "FPReg") %>% 
  spread(measure, value) %>%
  # filter(eyetr_value > 0, motr_value > 0)
  mutate(eyetr_value =  pmax(eyetr_value, 1e-5),
         motr_value = pmax(motr_value, 1e-5))
print(cor.test(reg_df$eyetr_value, reg_df$motr_value)$estimate)
   cor 
0.2454 
# View(reg_df)
reg_df %>% 
  gather(measure, value, 12:13) %>%
  ggplot(aes(x = value)) +
  geom_density() +
  facet_wrap(~measure, scales = "free") +
  theme_bw() +
  scale_fill_brewer(palette = "Set1")

reg_temp <- reg_df[c("eyetr_value", "motr_value")] %>% data.matrix()

# Set up the plotting area with two side-by-side plots
par(mfrow = c(1, 2))

# Plot the first data matrix td_temp
plot(reg_temp, pch = 16, col = "blue",
     main = "Not Log-Transformed")

# -------fit model FPReg ----------
reg_data = list(x=reg_temp, N=nrow(reg_temp))
fit_reg = stan(
  file="stan_models/bivariate_beta_correlation_reg.stan", 
  data=reg_data, 
  iter=4000, 
  chains=4, 
  cores=8,
  seed=444,
  # control=list(adapt_delta=0.99), 
  verbose = FALSE
  )

# Save the model 
fit_reg@stanmodel@dso <- new("cxxdso")
saveRDS(fit_reg, file = paste0("motr_eyetr_FPReg_cor_drop0s.rds"))
# models with all 0s
fit_gd = readRDS("./motr_eyetr_gaze_duration_cor.rds")
fit_gpt = readRDS("./motr_eyetr_go_past_time_cor.rds")
fit_td = readRDS("./motr_eyetr_total_duration_cor.rds")
fit_reg = readRDS("./motr_eyetr_FPReg_cor.rds")

# models for drop 0s
# fit_gd = readRDS("./motr_eyetr_gaze_duration_cor_drop0s.rds")
# fit_gpt = readRDS("./motr_eyetr_go_past_time_cor_drop0s.rds")
# fit_td = readRDS("./motr_eyetr_total_duration_cor_drop0s.rds")
# fit_reg = readRDS("./motr_eyetr_FPReg_cor_drop0s.rds")

print('---------------------------- Gaze Duration--------------------------------------------')
[1] "---------------------------- Gaze Duration--------------------------------------------"
print(fit_gd)
Inference for Stan model: bivariate_correlation.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

                  mean se_mean     sd      2.5%       25%       50%       75%     97.5% n_eff Rhat
mu[1]           125.79    0.01   1.06    123.70    125.05    125.78    126.52    127.85  6415    1
mu[2]           201.36    0.03   2.02    197.35    200.00    201.35    202.73    205.33  6243    1
sigma[1]         75.24    0.01   0.85     73.59     74.67     75.23     75.80     76.93  5554    1
sigma[2]        141.51    0.02   1.62    138.34    140.42    141.51    142.60    144.67  5947    1
nu               67.21    0.20  17.95     39.60     54.39     64.56     77.13    109.21  8434    1
rho               0.82    0.00   0.01      0.80      0.81      0.82      0.82      0.83  6766    1
cov[1,1]       5662.24    1.72 128.14   5416.22   5575.11   5659.86   5745.30   5917.61  5551    1
cov[1,2]       8685.45    3.11 212.25   8279.31   8538.73   8681.39   8824.04   9105.51  4657    1
cov[2,1]       8685.45    3.11 212.25   8279.31   8538.73   8681.39   8824.04   9105.51  4657    1
cov[2,2]      20027.42    5.94 457.93  19138.56  19716.41  20025.43  20333.73  20929.67  5948    1
x_rand[1]       138.57    0.76  67.06     20.92     90.39    135.44    181.71    278.91  7876    1
x_rand[2]       228.21    1.42 123.41     23.91    135.54    219.29    310.19    484.45  7563    1
attempt           0.11    0.00   0.34      0.00      0.00      0.00      0.00      1.00  8077    1
max_attempts   1000.00     NaN   0.00   1000.00   1000.00   1000.00   1000.00   1000.00   NaN  NaN
lp__         -55825.25    0.03   1.73 -55829.39 -55826.17 -55824.95 -55823.98 -55822.84  3949    1

Samples were drawn using NUTS(diag_e) at Sat Jul 22 14:54:30 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
print('---------------------------- Go Past Time--------------------------------------------')
[1] "---------------------------- Go Past Time--------------------------------------------"
print(fit_gpt)
Inference for Stan model: bivariate_correlation.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

                  mean se_mean     sd      2.5%       25%       50%       75%     97.5% n_eff Rhat
mu[1]           147.00    0.02   1.50    144.05    145.98    147.01    148.00    149.89  6405    1
mu[2]           205.47    0.03   2.45    200.61    203.83    205.51    207.14    210.20  6441    1
sigma[1]         94.99    0.02   1.29     92.47     94.13     95.01     95.86     97.55  5688    1
sigma[2]        155.50    0.03   2.15    151.26    154.09    155.49    156.95    159.73  5766    1
nu                7.54    0.01   0.57      6.53      7.14      7.50      7.89      8.75  6096    1
rho               0.80    0.00   0.01      0.79      0.80      0.80      0.81      0.82  7275    1
cov[1,1]       9025.61    3.26 245.47   8551.40   8860.01   9025.97   9188.35   9516.81  5687    1
cov[1,2]      11835.28    4.75 338.12  11168.95  11610.06  11836.87  12061.87  12507.53  5075    1
cov[2,1]      11835.28    4.75 338.12  11168.95  11610.06  11836.87  12061.87  12507.53  5075    1
cov[2,2]      24186.07    8.79 667.52  22879.89  23743.24  24176.78  24634.26  25514.54  5770    1
x_rand[1]       174.00    1.04  93.42     23.81    107.45    163.64    228.93    381.05  8038    1
x_rand[2]       250.51    1.65 147.29     25.35    144.88    232.92    337.60    580.10  8015    1
attempt           0.17    0.00   0.45      0.00      0.00      0.00      0.00      1.00  8278    1
max_attempts   1000.00     NaN   0.00   1000.00   1000.00   1000.00   1000.00   1000.00   NaN  NaN
lp__         -57729.27    0.03   1.72 -57733.34 -57730.21 -57728.95 -57728.00 -57726.89  3578    1

Samples were drawn using NUTS(diag_e) at Sat Jul 22 15:12:39 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
print('---------------------------- Total Duration--------------------------------------------')
[1] "---------------------------- Total Duration--------------------------------------------"
print(fit_td)
Inference for Stan model: bivariate_correlation.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

                  mean se_mean     sd      2.5%       25%       50%       75%     97.5% n_eff Rhat
mu[1]           173.42    0.02   1.42    170.69    172.45    173.41    174.36    176.23  5366    1
mu[2]           250.34    0.03   2.63    245.22    248.58    250.33    252.11    255.51  5883    1
sigma[1]         95.97    0.02   1.23     93.60     95.16     95.97     96.77     98.44  5507    1
sigma[2]        177.77    0.03   2.34    173.20    176.17    177.73    179.36    182.38  5591    1
nu               21.87    0.06   4.44     15.31     18.76     21.22     24.20     32.11  4880    1
rho               0.80    0.00   0.01      0.79      0.79      0.80      0.80      0.81  7369    1
cov[1,1]       9212.50    3.18 235.62   8760.98   9054.56   9209.71   9364.36   9690.76  5503    1
cov[1,2]      13638.88    5.20 366.78  12944.80  13389.27  13630.18  13883.70  14380.99  4976    1
cov[2,1]      13638.88    5.20 366.78  12944.80  13389.27  13630.18  13883.70  14380.99  4976    1
cov[2,2]      31608.56   11.12 830.86  29999.18  31035.03  31589.54  32169.43  33263.08  5587    1
x_rand[1]       190.27    0.98  88.62     36.10    126.07    185.26    247.04    375.18  8190    1
x_rand[2]       285.15    1.82 158.43     27.54    166.89    270.34    384.29    636.46  7595    1
attempt           0.11    0.00   0.35      0.00      0.00      0.00      0.00      1.00  7801    1
max_attempts     10.00     NaN   0.00     10.00     10.00     10.00     10.00     10.00   NaN  NaN
lp__         -58397.55    0.03   1.77 -58401.90 -58398.49 -58397.22 -58396.27 -58395.11  3901    1

Samples were drawn using NUTS(diag_e) at Sat Jul 22 16:14:49 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
print('---------------------------- First Pass Regression Prob.--------------------------------------------')
[1] "---------------------------- First Pass Regression Prob.--------------------------------------------"
print(fit_reg)
Inference for Stan model: bivariate_correlation_reg.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

               mean se_mean      sd     2.5%      25%      50%      75%    97.5% n_eff Rhat
alpha[1]       0.85    0.00    0.02     0.81     0.84     0.85     0.86     0.89  5443    1
alpha[2]       0.15    0.00    0.00     0.14     0.14     0.15     0.15     0.15  7702    1
beta[1]        4.64    0.00    0.14     4.37     4.54     4.64     4.73     4.92  5975    1
beta[2]        2.52    0.00    0.12     2.29     2.44     2.52     2.60     2.76  7877    1
L[1,1]         1.00     NaN    0.00     1.00     1.00     1.00     1.00     1.00   NaN  NaN
L[1,2]         0.00     NaN    0.00     0.00     0.00     0.00     0.00     0.00   NaN  NaN
L[2,1]         0.45    0.00    0.38    -0.41     0.18     0.52     0.77     0.95  8489    1
L[2,2]         0.78    0.00    0.21     0.31     0.64     0.85     0.96     1.00  6201    1
mu[1]          2.34    0.00    0.05     2.25     2.31     2.34     2.37     2.44  5468    1
mu[2]          1.16    0.00    0.00     1.15     1.16     1.16     1.16     1.16  7701    1
sigma[1]     104.39    0.19   14.73    78.70    93.94   103.18   113.48   136.81  5984    1
sigma[2]      12.55    0.02    1.50     9.91    11.50    12.44    13.51    15.76  7872    1
rho[1,1]       1.00     NaN    0.00     1.00     1.00     1.00     1.00     1.00   NaN  NaN
rho[1,2]       0.45    0.00    0.38    -0.41     0.18     0.52     0.77     0.95  8489    1
rho[2,1]       0.45    0.00    0.38    -0.41     0.18     0.52     0.77     0.95  8489    1
rho[2,2]       1.00    0.00    0.00     1.00     1.00     1.00     1.00     1.00   592    1
Sigma[1,1] 11114.32   41.44 3195.37  6193.09  8824.35 10646.59 12878.40 18717.61  5946    1
Sigma[1,2]   583.46    5.69  518.49  -527.26   234.91   654.32   971.41  1433.33  8291    1
Sigma[2,1]   583.46    5.69  518.49  -527.26   234.91   654.32   971.41  1433.33  8291    1
Sigma[2,2]   159.88    0.44   38.81    98.15   132.31   154.69   182.47   248.29  7789    1
x_rand[1]      0.16    0.00    0.14     0.00     0.05     0.12     0.23     0.53  7955    1
x_rand[2]      0.06    0.00    0.12     0.00     0.00     0.00     0.05     0.45  7762    1
lp__       14798.20    0.03    1.56 14794.21 14797.42 14798.55 14799.33 14800.22  3508    1

Samples were drawn using NUTS(diag_e) at Sat Jul 22 20:39:27 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
# stan_trace(fit_gd, pars=c("rho", "mu", "sigma", "nu"))
# stan_dens(fit_gd, pars=c("rho", "mu", "sigma", "nu"), separate_chains = TRUE)
# stan_plot(fit_gd, pars=c("rho", "mu", "sigma", "nu"))

# Gaze Duration
stan_trace(fit_gd)
stan_dens(fit_gd, separate_chains = TRUE)
stan_plot(fit_gd)

# Go Past Time
stan_trace(fit_gpt)
stan_dens(fit_gpt, separate_chains = TRUE)
stan_plot(fit_gpt)

# Total Duration
stan_trace(fit_td)
stan_dens(fit_td, separate_chains = TRUE)
stan_plot(fit_td)

# FPReg
stan_trace(fit_reg)
stan_dens(fit_reg, separate_chains = TRUE)
stan_plot(fit_reg)
p1 <- stan_trace(fit_gd, pars = 'rho', inc_warmup = FALSE)
p2 <- stan_dens(fit_gd, pars = 'rho', separate_chains = TRUE)
p3 <- stan_trace(fit_gd, pars = 'mu[1]', inc_warmup = FALSE)
p4 <- stan_dens(fit_gd, pars = 'mu[1]', separate_chains = TRUE)
p5 <- stan_trace(fit_gd, pars = 'mu[2]', inc_warmup = FALSE)
p6 <- stan_dens(fit_gd, pars = 'mu[2]', separate_chains = TRUE)
p7 <- stan_trace(fit_gd, pars = 'sigma[1]', inc_warmup = FALSE)
p8 <- stan_dens(fit_gd, pars = 'sigma[1]', separate_chains = TRUE)
p9 <- stan_trace(fit_gd, pars = 'sigma[2]', inc_warmup = FALSE)
p10 <- stan_dens(fit_gd, pars = 'sigma[2]', separate_chains = TRUE)
p11 <- stan_trace(fit_gd, pars = 'nu', inc_warmup = FALSE)
p12 <- stan_dens(fit_gd, pars = 'nu', separate_chains = TRUE)


# Use grid.arrange() to arrange the plots
# grid.arrange(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, ncol=2, nrow=6)
print('---------------------------- Gaze Duration--------------------------------------------')
[1] "---------------------------- Gaze Duration--------------------------------------------"
rho_gd = as.numeric(extract(fit_gd, "rho")[[1]])
mean = mean(rho_gd)
crI = quantile(rho_gd, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_gd), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: 0.8156
HPD: [0.8029, 0.8278]
crI: [0.8029, 0.8278]
print('---------------------------- Go Past Time--------------------------------------------')
[1] "---------------------------- Go Past Time--------------------------------------------"
rho_gpt = as.numeric(extract(fit_gpt, "rho")[[1]])
mean = mean(rho_gpt)
crI = quantile(rho_gpt, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_gpt), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: 0.8011
HPD: [0.7863, 0.8161]
crI: [0.7857, 0.8157]
print('---------------------------- Total Duration--------------------------------------------')
[1] "---------------------------- Total Duration--------------------------------------------"
rho_td = as.numeric(extract(fit_td, "rho")[[1]])
mean = mean(rho_td)
crI = quantile(rho_td, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_td), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: 0.7993
HPD: [0.7847, 0.8127]
crI: [0.785, 0.8131]
print('---------------------------- First Pass Regression --------------------------------------------')
[1] "---------------------------- First Pass Regression --------------------------------------------"
rho_reg = as.numeric(extract(fit_reg, "rho[1, 2]")[[1]])
mean = mean(rho_reg)
crI = quantile(rho_reg, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_reg), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]")
Mean: 0.4456
HPD: [-0.2832, 0.9833]
crI: [-0.4076, 0.9497]
print('---------------------------- Gaze Duration--------------------------------------------')
[1] "---------------------------- Gaze Duration--------------------------------------------"
gd_rand <- extract(fit_gd, "x_rand")[[1]]
# x_rand_filtered <- x_rand[apply(x_rand, 1, function(x) all(x > 0)),]
# x_rand_filtered

# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 400), ylim=c(0, 700), type="n",
     xlab = "Eye tracking value", ylab = "MoTR value", main = "Gaze Duration") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color 
points(gd_rand[,1], gd_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(gd_temp, pch=16, col="red")

# add dataEllipse with color 
dataEllipse(gd_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(gd_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")


print('---------------------------- Go Past Time--------------------------------------------')
[1] "---------------------------- Go Past Time--------------------------------------------"
gpt_rand <- extract(fit_gpt, "x_rand")[[1]]

# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 800), ylim=c(0, 1200), type="n",
     xlab = "Eye tracking value", ylab = "MoTR value", main = "Go Past Time") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color 
points(gpt_rand[,1], gpt_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(gpt_temp, pch=16, col="red")

# add dataEllipse with color 
dataEllipse(gpt_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(gpt_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")


print('---------------------------- Total Duration--------------------------------------------')
[1] "---------------------------- Total Duration--------------------------------------------"
td_rand <- extract(fit_td, "x_rand")[[1]]

# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 800), ylim=c(0, 1200), type="n",
     xlab = "Eye tracking value", ylab = "MoTR value", main = "Total Duration") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color 
points(td_rand[,1], td_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(td_temp, pch=16, col="red")

# add dataEllipse with color 
dataEllipse(td_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(td_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")


print('---------------------------- First Pass Regression --------------------------------------------')
[1] "---------------------------- First Pass Regression --------------------------------------------"
reg_rand <- extract(fit_reg, "x_rand")[[1]]

# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 1), ylim=c(0, 1), type="n",
     xlab = "Eye tracking value", ylab = "MoTR value", main = "FPReg") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color 
points(reg_rand[,1], reg_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(reg_temp, pch=16, col="red")

# add dataEllipse with color 
dataEllipse(reg_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(reg_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")

NA
NA

model motr eyetr FPReg correlation (eyetr < 0.3)

print("First Pass Regression Prob. all and  < 0.3")
[1] "First Pass Regression Prob. all and  < 0.3"
reg_df_all = provo_df %>% filter(metric == "FPReg") %>% 
  spread(measure, value) %>%
  # filter(eyetr_value > 0, motr_value > 0) %>%
  # mutate(eyetr_value =  pmax(eyetr_value, 1e-5),
         # motr_value = pmax(motr_value, 1e-5))
  mutate(s_eyetr_value = scale(eyetr_value),
         s_motr_value = scale(motr_value))

reg_df_all_drop0s = provo_df %>% filter(metric == "FPReg") %>% 
  spread(measure, value) %>%
  filter(eyetr_value > 0, motr_value > 0) %>%
  # mutate(eyetr_value =  pmax(eyetr_value, 1e-5),
         # motr_value = pmax(motr_value, 1e-5))
  mutate(s_eyetr_value = scale(eyetr_value),
         s_motr_value = scale(motr_value))

reg_df_low_drop0 = provo_df %>% filter(metric == "FPReg") %>% 
  spread(measure, value) %>%
  filter(eyetr_value > 0, motr_value > 0) %>%
  mutate(eyetr_value =  pmax(eyetr_value, 1e-5),
         motr_value = pmax(motr_value, 1e-5)) %>%
  filter(eyetr_value < 0.3)

reg_df_low = provo_df %>% filter(metric == "FPReg") %>% 
  spread(measure, value) %>%
  # filter(eyetr_value > 0, motr_value > 0) %>%
  mutate(eyetr_value =  pmax(eyetr_value, 1e-5),
         motr_value = pmax(motr_value, 1e-5)) %>%
  filter(eyetr_value < 0.3)
  # mutate(eyetr_value = exp(eyetr_value),
         # motr_value = exp(motr_value)
         # )
# View(reg_df)

print(cor.test(reg_df_all$eyetr_value, reg_df_all$motr_value)$estimate)
   cor 
0.2454 
print(cor.test(reg_df_all$eyetr_value, reg_df_all$motr_value)$p.value)
[1] 0.000000000000000000000000000000000004739
print(cor.test(reg_df_all$s_eyetr_value, reg_df_all$s_motr_value)$estimate)
   cor 
0.2454 
print(cor.test(reg_df_all$s_eyetr_value, reg_df_all$s_motr_value)$p.value)
[1] 0.000000000000000000000000000000000004739
print("--------------------------------------------------------------------")
[1] "--------------------------------------------------------------------"
print(cor.test(reg_df_all_drop0s$eyetr_value, reg_df_all_drop0s$motr_value)$estimate)
   cor 
0.3225 
print(cor.test(reg_df_all_drop0s$eyetr_value, reg_df_all_drop0s$motr_value)$p.value)
[1] 0.00000000000000000000001143
print(cor.test(reg_df_all_drop0s$s_eyetr_value, reg_df_all_drop0s$s_motr_value)$estimate)
   cor 
0.3225 
print(cor.test(reg_df_all_drop0s$s_eyetr_value, reg_df_all_drop0s$s_motr_value)$p.value)
[1] 0.00000000000000000000001143
# print(cor.test(reg_df_low$eyetr_value, reg_df_low$motr_value)$estimate)
# print(cor.test(reg_df_low$eyetr_value, reg_df_low$motr_value)$p.value)
# print(cor.test(reg_df_low_drop0$eyetr_value, reg_df_low_drop0$motr_value)$estimate)
# print(cor.test(reg_df_low_drop0$eyetr_value, reg_df_low_drop0$motr_value)$p.value)

# View(reg_df)
reg_df_low %>% 
  gather(measure, value, 12:13) %>%
  ggplot(aes(x = value)) +
  geom_density() +
  facet_wrap(~measure, scales = "free") +
  theme_bw() +
  scale_fill_brewer(palette = "Set1")

reg_temp_all <- reg_df_all[c("eyetr_value", "motr_value")] %>% data.matrix()
reg_temp_all_scaled <- reg_df_all[c("s_eyetr_value", "s_motr_value")] %>% data.matrix()
reg_temp_low <- reg_df_low[c("eyetr_value", "motr_value")] %>% data.matrix()
reg_temp_low_drop0 <- reg_df_low_drop0[c("eyetr_value", "motr_value")] %>% data.matrix()

# Set up the plotting area with two side-by-side plots
par(mfrow = c(1, 2))

# Plot the first data matrix td_temp
# plot(reg_temp_low, pch = 16, col = "blue",
#      main = "Not Log-Transformed")
plot(reg_temp_all, pch = 16, col = "blue",
     main = "Original data")
plot(reg_temp_all_scaled, pch = 16, col = "blue",
     main = "0-1 scaled data")

# -------fit model FPReg < 0.3 ----------
reg_data = list(x=reg_temp_all, N=nrow(reg_temp_all))
fit_reg = stan(
  # file="stan_models/bivariate_beta_correlation_reg.stan", 
  file = "stan_models/bivariate_normal_reg.stan",
  data=reg_data, 
  iter=4000, 
  chains=4, 
  cores=4,
  seed=444,
  # control=list(adapt_delta=0.99), 
  verbose = FALSE
  )

# Save the model 
fit_reg@stanmodel@dso <- new("cxxdso")
saveRDS(fit_reg, file = paste0("motr_eyetr_FPReg_cor_all_data_drop0s.rds"))

model motr eyetr FPReg correlation (eyetr >= 0.3)

print("First Pass Regression Prob. >= 0.3")
[1] "First Pass Regression Prob. >= 0.3"
reg_df_high_drop0 = provo_df %>% filter(metric == "FPReg") %>% 
  spread(measure, value) %>%
  filter(eyetr_value > 0, motr_value > 0) %>%
  mutate(eyetr_value =  pmax(eyetr_value, 1e-5),
         motr_value = pmax(motr_value, 1e-5)) %>%
  filter(eyetr_value >= 0.3)

reg_df_high = provo_df %>% filter(metric == "FPReg") %>% 
  spread(measure, value) %>%
  # filter(eyetr_value > 0, motr_value > 0) %>%
  mutate(eyetr_value =  pmax(eyetr_value, 1e-5),
         motr_value = pmax(motr_value, 1e-5)) %>%
  filter(eyetr_value >= 0.3)
  # mutate(eyetr_value = exp(eyetr_value),
         # motr_value = exp(motr_value)
         # )
# View(reg_df)
# print("---------------------Pearson---------------------------")
# print(cor.test(reg_df_high$eyetr_value, reg_df_high$motr_value)$estimate, method='Pearson')
# print(cor.test(reg_df_high$eyetr_value, reg_df_high$motr_value)$p.value, method='Pearson')
# print(cor.test(reg_df_high_drop0$eyetr_value, reg_df_high_drop0$motr_value)$estimate, method='Pearson')
# print(cor.test(reg_df_high_drop0$eyetr_value, reg_df_high_drop0$motr_value)$p.value, method='Pearson')
# print("---------------------Spearman---------------------------")
# print(cor.test(reg_df_high$eyetr_value, reg_df_high$motr_value)$estimate, method='Spearman')
# print(cor.test(reg_df_high$eyetr_value, reg_df_high$motr_value)$p.value, method='Spearman')
# print(cor.test(reg_df_high_drop0$eyetr_value, reg_df_high_drop0$motr_value)$estimate, method='Spearman')
# print(cor.test(reg_df_high_drop0$eyetr_value, reg_df_high_drop0$motr_value)$p.value, method='Spearman')
# print("---------------------Scaled lm ---------------------------")
# m.scaled = lm(scale(motr_value) ~ 1 + scale(eyetr_value), data = reg_df_high)
# summary(m.scaled)


# View(reg_df)
reg_df_high %>% 
  gather(measure, value, 12:13) %>%
  ggplot(aes(x = value)) +
  geom_density() +
  facet_wrap(~measure, scales = "free") +
  theme_bw() +
  scale_fill_brewer(palette = "Set1")

reg_temp_high <- reg_df_high[c("eyetr_value", "motr_value")] %>% data.matrix()
reg_temp_high_drop0 <- reg_df_high_drop0[c("eyetr_value", "motr_value")] %>% data.matrix()

# Set up the plotting area with two side-by-side plots
par(mfrow = c(1, 3))

# Plot the first data matrix td_temp
plot(reg_temp_all, pch = 16, col = "blue",
     main = "FPReg not logged all data")
plot(reg_temp_low, pch = 16, col = "blue",
     main = "FPReg not logged eyetr < 0.3 ")
plot(reg_temp_high, pch = 16, col = "blue",
     main = "FPReg not logged eyetr >= 0.3")


print("---------------------Pearson---------------------------")
[1] "---------------------Pearson---------------------------"
print(cor.test(reg_df_all$eyetr_value, reg_df_all$motr_value)$estimate, method='Pearson')
   cor 
0.2454 
print(cor.test(reg_df_all$eyetr_value, reg_df_all$motr_value)$p.value, method='Pearson')
[1] 0.000000000000000000000000000000000004739
print(cor.test(reg_df_all_drop0s$eyetr_value, reg_df_all_drop0s$motr_value)$estimate, method='Pearson')
   cor 
0.3225 
print(cor.test(reg_df_all_drop0s$eyetr_value, reg_df_all_drop0s$motr_value)$p.value, method='Pearson')
[1] 0.00000000000000000000001143
print("---------------------Spearman---------------------------")
[1] "---------------------Spearman---------------------------"
print(cor.test(reg_df_all$eyetr_value, reg_df_all$motr_value)$estimate, method='Spearman')
   cor 
0.2454 
print(cor.test(reg_df_all$eyetr_value, reg_df_all$motr_value)$p.value, method='Spearman')
[1] 0.000000000000000000000000000000000004739
print(cor.test(reg_df_all_drop0s$eyetr_value, reg_df_all_drop0s$motr_value)$estimate, method='Spearman')
   cor 
0.3225 
print(cor.test(reg_df_all_drop0s$eyetr_value, reg_df_all_drop0s$motr_value)$p.value, method='Spearman')
[1] 0.00000000000000000000001143
print("---------------------Scaled lm ---------------------------")
[1] "---------------------Scaled lm ---------------------------"
m.scaled = lm(scale(motr_value) ~ 1 + scale(eyetr_value), data = reg_df_all)
summary(m.scaled)

Call:
lm(formula = scale(motr_value) ~ 1 + scale(eyetr_value), data = reg_df_all)

Residuals:
   Min     1Q Median     3Q    Max 
 -1.74  -0.57  -0.40   0.44   6.84 

Coefficients:
                               Estimate           Std. Error t value            Pr(>|t|)    
(Intercept)        -0.00000000000000059  0.01926560159151626     0.0                   1    
scale(eyetr_value)  0.24538623826853576  0.01926940563965124    12.7 <0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.97 on 2531 degrees of freedom
Multiple R-squared:  0.0602,    Adjusted R-squared:  0.0598 
F-statistic:  162 on 1 and 2531 DF,  p-value: <0.0000000000000002
coef(m.scaled)[2]
scale(eyetr_value) 
            0.2454 
summary(m.scaled)$coefficients[2, 4]
[1] 0.000000000000000000000000000000000004739
m.scaled_drop0s = lm(scale(motr_value) ~ 1 + scale(eyetr_value), data = reg_df_all_drop0s)
summary(m.scaled_drop0s)

Call:
lm(formula = scale(motr_value) ~ 1 + scale(eyetr_value), data = reg_df_all_drop0s)

Residuals:
   Min     1Q Median     3Q    Max 
-1.779 -0.598 -0.214  0.368  5.549 

Coefficients:
                               Estimate           Std. Error t value            Pr(>|t|)    
(Intercept)        -0.00000000000000176  0.03125802679731712     0.0                   1    
scale(eyetr_value)  0.32254171528306036  0.03127506578838755    10.3 <0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.947 on 916 degrees of freedom
Multiple R-squared:  0.104, Adjusted R-squared:  0.103 
F-statistic:  106 on 1 and 916 DF,  p-value: <0.0000000000000002
# m.scaled_drop0s_inv = lm(scale(eyetr_value) ~ 1 + scale(motr_value), data = reg_df_all_drop0s)
# summary(m.scaled_drop0s_inv)

divide data into two part, this is high part (eyetr FPReg prob. >= 0.3)

# -------fit model FPReg >= 0.3 ----------
reg_data = list(x=reg_temp_high_drop0, N=nrow(reg_temp_high_drop0))
fit_reg = stan(
  # file="stan_models/bivariate_beta_correlation_reg.stan", 
  file = "stan_models/bivariate_normal_reg.stan",
  data=reg_data, 
  iter=4000, 
  chains=4, 
  cores=4,
  seed=444,
  # control=list(adapt_delta=0.99), 
  verbose = FALSE
  )

# Save the model 
fit_reg@stanmodel@dso <- new("cxxdso")
saveRDS(fit_reg, file = paste0("motr_eyetr_FPReg_cor_03-1_drop0s.rds"))

use linear model to model the all data

exp = "motr_eyetr_FPReg"

priors_cor_motr_eyetr <- c(
  prior(normal(0, 10), class = Intercept),
  prior(normal(0, 10), class = b),
  prior(normal(0, 10), class = sigma)
)

model = brms::brm( scale(motr_value) ~ 1 + scale(eyetr_value), 
                                data = reg_df_all,
                                chains = 4,
                                family = gaussian(),
                                file = paste0("./temp/", exp, "_lm_with0s"),
                                cores = 4,
                                backend = "cmdstanr",
                                prior = priors_cor_motr_eyetr,
                                warmup = 2000,
                                iter = 4000,
                                # control = list(adapt_delta = 0.9),
                                save_pars = save_pars(all = TRUE)
                                )
posterior_samples_motr_eyetr_cor <- as.data.frame(motr_eyetr_cor)
posterior_samples_motr_eyetr_cor
# Get all the draws of scaleeyetr_value
cor_draws <- posterior_samples_motr_eyetr_cor$b_scaleeyetr_value %>% data.frame()
View(cor_draws)

pp_check(motr_eyetr_cor, type = "dens_overlay")
Using 10 posterior draws for ppc type 'dens_overlay' by default.

pp_check(motr_eyetr_cor, type = "scatter")
Using 10 posterior draws for ppc type 'scatter' by default.

=======================================================RANK=======================================================

correlate motr-eyetr ranked data

print("Rank First Pass Regression Prob. all data")
[1] "Rank First Pass Regression Prob. all data"
reg_df_rank = provo_df %>% filter(metric == "FPReg") %>% 
  spread(measure, value) %>%
  # filter(eyetr_value > 0, motr_value > 0) %>%
  mutate(eyetr_rank = rank(eyetr_value, ties.method = "max"), 
         motr_rank = rank(motr_value, ties.method = "max"))

reg_df_rank_drop0s = provo_df %>% filter(metric == "FPReg") %>% 
  spread(measure, value) %>%
  filter(eyetr_value > 0, motr_value > 0) %>%
  mutate(eyetr_rank = rank(eyetr_value, ties.method = "max"), 
         motr_rank = rank(motr_value, ties.method = "max"))

View(reg_df_rank)
print(cor.test(reg_df_rank$eyetr_rank, reg_df_rank$motr_rank)$estimate)
  cor 
0.151 
print(cor.test(reg_df_rank$eyetr_rank, reg_df_rank$motr_rank)$p.value)
[1] 0.00000000000002169
print(cor.test(reg_df_rank_drop0s$eyetr_rank, reg_df_rank_drop0s$motr_rank)$estimate)
   cor 
0.1491 
print(cor.test(reg_df_rank_drop0s$eyetr_rank, reg_df_rank_drop0s$motr_rank)$p.value)
[1] 0.00000568
reg_df_rank %>% 
  gather(measure, value, 14:15) %>%
  ggplot(aes(x = value)) +
  geom_density() +
  facet_wrap(~measure, scales = "free") +
  theme_bw() +
  scale_fill_brewer(palette = "Set1")


reg_df_rank_drop0s %>% 
  gather(measure, value, 14:15) %>%
  ggplot(aes(x = value)) +
  geom_density() +
  facet_wrap(~measure, scales = "free") +
  theme_bw() +
  scale_fill_brewer(palette = "Set1")

reg_temp_rank <- reg_df_rank[c("eyetr_rank", "motr_rank")] %>% data.matrix()
reg_temp_rank_drop0s <- reg_df_rank_drop0s[c("eyetr_rank", "motr_rank")] %>% data.matrix()

# Set up the plotting area with two side-by-side plots
par(mfrow = c(1, 2))

# Plot the first data matrix td_temp
plot(reg_temp_rank, pch = 16, col = "blue",
     main = "FPReg ranked")
plot(reg_temp_rank_drop0s, pch = 16, col = "blue",
     main = "FPReg ranked drop0s ")

NA
NA
reg_rank_data = list(x=reg_temp_rank, N=nrow(reg_temp_rank))

fit_reg_rank = stan(
  file="stan_models/bivariate_correlation.stan", 
  data=reg_rank_data, 
  iter=4000, 
  chains=4, 
  cores=8,
  seed=444,
  # control=list(adapt_delta=0.99), 
  verbose = FALSE
  )

# Save the model 
fit_reg_rank@stanmodel@dso <- new("cxxdso")
saveRDS(fit_reg_rank, file = paste0("./temp/ranked_motr_eyetr_FPReg_cor.rds"))

correlate eyetr-eyetr ranked data

print("Rank First Pass Regression Prob. all data")
[1] "Rank First Pass Regression Prob. all data"
ereg_df_rank = provo_eyetr_grouped_df %>% filter(metric == "FPReg") %>% distinct() %>% #group_by(text_id, metric, measure) %>%
  # summarize(value = mean(value)) %>%
  filter(!(row_number() %in% c(443, 444, 445, 446))) %>%
    spread(measure, value) %>%
  # filter(eyetr_value > 0, motr_value > 0) %>%
  mutate(eyetr1_rank = rank(value_1, ties.method = "max"),
         eyetr2_rank = rank(value_2, ties.method = "max"))

ereg_df_rank_drop0s = provo_eyetr_grouped_df %>% filter(metric == "FPReg") %>% distinct() %>% #group_by(text_id, metric, measure) %>%
  # summarize(value = mean(value)) %>%
  filter(!(row_number() %in% c(443, 444, 445, 446))) %>%
    spread(measure, value) %>%
  filter(value_1 > 0, value_2 > 0) %>%
  mutate(eyetr1_rank = rank(value_1, ties.method = "max"),
         eyetr2_rank = rank(value_2, ties.method = "max"))

View(ereg_df_rank)
print(cor.test(ereg_df_rank$eyetr1_rank, ereg_df_rank$eyetr2_rank)$estimate)
   cor 
0.6001 
print(cor.test(ereg_df_rank$eyetr1_rank, ereg_df_rank$eyetr2_rank)$p.value)
[1] 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004421
print(cor.test(ereg_df_rank_drop0s$eyetr1_rank, ereg_df_rank_drop0s$eyetr2_rank)$estimate)
   cor 
0.5845 
print(cor.test(ereg_df_rank_drop0s$eyetr1_rank, ereg_df_rank_drop0s$eyetr2_rank)$p.value)
[1] 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007256
ereg_df_rank %>% 
  gather(measure, value, 7:8) %>%
  ggplot(aes(x = value)) +
  geom_density() +
  facet_wrap(~measure, scales = "free") +
  theme_bw() +
  scale_fill_brewer(palette = "Set1")


ereg_df_rank_drop0s %>% 
  gather(measure, value, 7:8) %>%
  ggplot(aes(x = value)) +
  geom_density() +
  facet_wrap(~measure, scales = "free") +
  theme_bw() +
  scale_fill_brewer(palette = "Set1")

ereg_temp_rank <- ereg_df_rank[c("eyetr1_rank", "eyetr2_rank")] %>% data.matrix()
ereg_temp_rank_drop0s <- ereg_df_rank_drop0s[c("eyetr1_rank", "eyetr2_rank")] %>% data.matrix()

# Set up the plotting area with two side-by-side plots
par(mfrow = c(1, 2))

# Plot the first data matrix td_temp
plot(ereg_temp_rank, pch = 16, col = "blue",
     main = "FPReg ranked")
plot(ereg_temp_rank_drop0s, pch = 16, col = "blue",
     main = "FPReg ranked drop0s ")

fit_mreg_all = readRDS("./motr_eyetr_FPReg_cor_all_data.rds")
fit_mreg_all_drop0 = readRDS("./motr_eyetr_FPReg_cor_all_data_drop0s.rds")
fit_mreg_low = readRDS("./motr_eyetr_FPReg_cor_00-03.rds")
fit_mreg_low_drop0 = readRDS("./motr_eyetr_FPReg_cor_00-03_drop0s.rds")
fit_mreg_high = readRDS("./motr_eyetr_FPReg_cor_03-1.rds")
fit_mreg_high_drop0 = readRDS("./motr_eyetr_FPReg_cor_03-1_drop0s.rds")

fit_rank_all = readRDS("./temp/ranked_motr_eyetr_FPReg_cor.rds")

print('---------------------------- First Pass Regression Prob. all data --------------------------------------------')
[1] "---------------------------- First Pass Regression Prob. all data --------------------------------------------"
print(fit_mreg_all)
Inference for Stan model: bivariate_normal_reg.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

                mean se_mean   sd    2.5%     25%     50%     75%   97.5% n_eff Rhat
mu[1]           0.12    0.00 0.00    0.12    0.12    0.12    0.13    0.13  5811    1
mu[2]           0.03    0.00 0.00    0.02    0.03    0.03    0.03    0.03  3384    1
sigma[1]        0.08    0.00 0.00    0.07    0.07    0.08    0.08    0.08  3694    1
sigma[2]        0.05    0.00 0.00    0.05    0.05    0.05    0.05    0.06  3040    1
nu              2.42    0.00 0.14    2.16    2.33    2.42    2.52    2.71  3250    1
rho             0.16    0.00 0.02    0.11    0.14    0.16    0.17    0.20  8176    1
cov[1,1]        0.01    0.00 0.00    0.01    0.01    0.01    0.01    0.01  3693    1
cov[1,2]        0.00    0.00 0.00    0.00    0.00    0.00    0.00    0.00  6348    1
cov[2,1]        0.00    0.00 0.00    0.00    0.00    0.00    0.00    0.00  6348    1
cov[2,2]        0.00    0.00 0.00    0.00    0.00    0.00    0.00    0.00  3053    1
x_rand[1]       0.16    0.00 0.12    0.02    0.09    0.14    0.20    0.40  7811    1
x_rand[2]       0.07    0.00 0.08    0.00    0.03    0.05    0.09    0.25  7966    1
attempt         0.63    0.01 1.03    0.00    0.00    0.00    1.00    3.00  7919    1
max_attempts   10.00     NaN 0.00   10.00   10.00   10.00   10.00   10.00   NaN  NaN
lp__         7450.58    0.03 1.78 7446.22 7449.65 7450.92 7451.89 7452.98  3519    1

Samples were drawn using NUTS(diag_e) at Sat Aug  5 23:08:09 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
print('---------------------------- First Pass Regression Prob. all data no 0s--------------------------------------------')
[1] "---------------------------- First Pass Regression Prob. all data no 0s--------------------------------------------"
print(fit_mreg_all_drop0)
Inference for Stan model: bivariate_normal_reg.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

                mean se_mean   sd    2.5%     25%     50%     75%   97.5% n_eff Rhat
mu[1]           0.15    0.00 0.00    0.14    0.15    0.15    0.15    0.16  8507    1
mu[2]           0.14    0.00 0.00    0.13    0.14    0.14    0.14    0.14  7923    1
sigma[1]        0.09    0.00 0.00    0.08    0.08    0.09    0.09    0.09  7186    1
sigma[2]        0.06    0.00 0.00    0.06    0.06    0.06    0.06    0.06  6227    1
nu              2.78    0.00 0.23    2.37    2.62    2.77    2.93    3.26  7008    1
rho             0.18    0.00 0.04    0.11    0.16    0.18    0.21    0.26  9833    1
cov[1,1]        0.01    0.00 0.00    0.01    0.01    0.01    0.01    0.01  7173    1
cov[1,2]        0.00    0.00 0.00    0.00    0.00    0.00    0.00    0.00  8599    1
cov[2,1]        0.00    0.00 0.00    0.00    0.00    0.00    0.00    0.00  8599    1
cov[2,2]        0.00    0.00 0.00    0.00    0.00    0.00    0.00    0.00  6234    1
x_rand[1]       0.18    0.00 0.13    0.02    0.10    0.16    0.22    0.43  7699    1
x_rand[2]       0.15    0.00 0.08    0.03    0.10    0.14    0.18    0.34  8175    1
attempt         0.16    0.00 0.43    0.00    0.00    0.00    0.00    1.00  7917    1
max_attempts   10.00     NaN 0.00   10.00   10.00   10.00   10.00   10.00   NaN  NaN
lp__         2566.44    0.03 1.75 2562.18 2565.53 2566.76 2567.72 2568.88  3487    1

Samples were drawn using NUTS(diag_e) at Sat Aug  5 23:18:11 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
print('---------------------------- First Pass Regression Prob.< 0.3--------------------------------------------')
[1] "---------------------------- First Pass Regression Prob.< 0.3--------------------------------------------"
print(fit_mreg_low)
Inference for Stan model: bivariate_normal_reg.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

                mean se_mean   sd    2.5%     25%     50%     75%   97.5% n_eff Rhat
mu[1]           0.12    0.00 0.00    0.11    0.12    0.12    0.12    0.12  8566    1
mu[2]           0.03    0.00 0.00    0.03    0.03    0.03    0.04    0.04  4981    1
sigma[1]        0.06    0.00 0.00    0.06    0.06    0.06    0.06    0.07  7280    1
sigma[2]        0.06    0.00 0.00    0.06    0.06    0.06    0.06    0.07  4552    1
nu              5.54    0.01 0.51    4.62    5.19    5.51    5.86    6.62  4637    1
rho             0.10    0.00 0.02    0.06    0.09    0.10    0.12    0.15  8596    1
cov[1,1]        0.00    0.00 0.00    0.00    0.00    0.00    0.00    0.00  7299    1
cov[1,2]        0.00    0.00 0.00    0.00    0.00    0.00    0.00    0.00  8259    1
cov[2,1]        0.00    0.00 0.00    0.00    0.00    0.00    0.00    0.00  8259    1
cov[2,2]        0.00    0.00 0.00    0.00    0.00    0.00    0.00    0.00  4571    1
x_rand[1]       0.13    0.00 0.07    0.02    0.08    0.12    0.17    0.28  8277    1
x_rand[2]       0.07    0.00 0.06    0.00    0.03    0.06    0.10    0.21  7280    1
attempt         0.53    0.01 0.90    0.00    0.00    0.00    1.00    3.00  8006    1
max_attempts   10.00     NaN 0.00   10.00   10.00   10.00   10.00   10.00   NaN  NaN
lp__         7794.82    0.03 1.78 7790.50 7793.88 7795.16 7796.13 7797.26  3232    1

Samples were drawn using NUTS(diag_e) at Sat Aug  5 20:52:03 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
print('---------------------------- First Pass Regression Prob.< 0.3 no 0s--------------------------------------------')
[1] "---------------------------- First Pass Regression Prob.< 0.3 no 0s--------------------------------------------"
print(fit_mreg_low_drop0)
Inference for Stan model: bivariate_normal_reg.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

                mean se_mean   sd    2.5%     25%     50%     75%   97.5% n_eff Rhat
mu[1]           0.13    0.00 0.00    0.13    0.13    0.13    0.13    0.14 10534    1
mu[2]           0.13    0.00 0.00    0.13    0.13    0.13    0.14    0.14  8839    1
sigma[1]        0.06    0.00 0.00    0.06    0.06    0.06    0.06    0.07  8534    1
sigma[2]        0.06    0.00 0.00    0.06    0.06    0.06    0.07    0.07  7122    1
nu              6.50    0.01 0.96    4.90    5.83    6.40    7.06    8.73  6790    1
rho             0.07    0.00 0.04    0.00    0.05    0.07    0.10    0.15 10356    1
cov[1,1]        0.00    0.00 0.00    0.00    0.00    0.00    0.00    0.00  8526    1
cov[1,2]        0.00    0.00 0.00    0.00    0.00    0.00    0.00    0.00 10435    1
cov[2,1]        0.00    0.00 0.00    0.00    0.00    0.00    0.00    0.00 10435    1
cov[2,2]        0.00    0.00 0.00    0.00    0.00    0.00    0.00    0.00  7123    1
x_rand[1]       0.14    0.00 0.07    0.02    0.09    0.13    0.18    0.28  8031    1
x_rand[2]       0.14    0.00 0.07    0.02    0.10    0.14    0.18    0.29  8006    1
attempt         0.08    0.00 0.30    0.00    0.00    0.00    0.00    1.00  7642    1
max_attempts   10.00     NaN 0.00   10.00   10.00   10.00   10.00   10.00   NaN  NaN
lp__         2737.21    0.03 1.76 2732.81 2736.27 2737.56 2738.50 2739.62  3992    1

Samples were drawn using NUTS(diag_e) at Sat Aug  5 20:30:02 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
print('---------------------------- First Pass Regression Prob.>= 0.3--------------------------------------------')
[1] "---------------------------- First Pass Regression Prob.>= 0.3--------------------------------------------"
print(fit_mreg_high)
Inference for Stan model: bivariate_normal_reg.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

               mean se_mean    sd   2.5%    25%    50%    75%  97.5% n_eff Rhat
mu[1]          0.45    0.00  0.01   0.44   0.45   0.45   0.46   0.47  5045    1
mu[2]          0.15    0.00  0.01   0.13   0.15   0.15   0.16   0.18  4628    1
sigma[1]       0.11    0.00  0.01   0.10   0.11   0.11   0.12   0.12  5622    1
sigma[2]       0.15    0.00  0.01   0.13   0.15   0.15   0.16   0.17  4499    1
nu            25.71    0.18 12.83   9.59  16.53  22.89  31.70  58.03  5109    1
rho            0.41    0.00  0.06   0.30   0.37   0.41   0.45   0.51  7137    1
cov[1,1]       0.01    0.00  0.00   0.01   0.01   0.01   0.01   0.02  5625    1
cov[1,2]       0.01    0.00  0.00   0.00   0.01   0.01   0.01   0.01  4842    1
cov[2,1]       0.01    0.00  0.00   0.00   0.01   0.01   0.01   0.01  4842    1
cov[2,2]       0.02    0.00  0.00   0.02   0.02   0.02   0.03   0.03  4553    1
x_rand[1]      0.47    0.00  0.11   0.25   0.39   0.47   0.54   0.70  7964    1
x_rand[2]      0.20    0.00  0.13   0.01   0.10   0.19   0.28   0.49  7829    1
attempt        0.19    0.01  0.47   0.00   0.00   0.00   0.00   1.00  7881    1
max_attempts  10.00     NaN  0.00  10.00  10.00  10.00  10.00  10.00   NaN  NaN
lp__         579.26    0.03  1.75 575.10 578.35 579.56 580.56 581.68  3529    1

Samples were drawn using NUTS(diag_e) at Sat Aug  5 22:25:38 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
print('---------------------------- First Pass Regression Prob.>= 0.3 no 0s--------------------------------------------')
[1] "---------------------------- First Pass Regression Prob.>= 0.3 no 0s--------------------------------------------"
print(fit_mreg_high_drop0)
Inference for Stan model: bivariate_normal_reg.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

               mean se_mean    sd   2.5%    25%    50%    75%  97.5% n_eff Rhat
mu[1]          0.48    0.00  0.01   0.46   0.48   0.48   0.49   0.51  6409    1
mu[2]          0.27    0.00  0.01   0.25   0.26   0.27   0.28   0.30  6397    1
sigma[1]       0.12    0.00  0.01   0.11   0.12   0.12   0.13   0.14  6555    1
sigma[2]       0.16    0.00  0.01   0.14   0.15   0.16   0.17   0.18  6281    1
nu            32.85    0.16 15.27  11.84  21.65  30.12  40.80  69.54  8953    1
rho            0.51    0.00  0.07   0.37   0.47   0.52   0.56   0.64  6986    1
cov[1,1]       0.02    0.00  0.00   0.01   0.01   0.02   0.02   0.02  6491    1
cov[1,2]       0.01    0.00  0.00   0.01   0.01   0.01   0.01   0.02  5145    1
cov[2,1]       0.01    0.00  0.00   0.01   0.01   0.01   0.01   0.02  5145    1
cov[2,2]       0.03    0.00  0.00   0.02   0.02   0.03   0.03   0.03  6242    1
x_rand[1]      0.49    0.00  0.13   0.25   0.41   0.49   0.57   0.74  8129    1
x_rand[2]      0.29    0.00  0.15   0.04   0.18   0.28   0.38   0.60  7467    1
attempt        0.06    0.00  0.24   0.00   0.00   0.00   0.00   1.00  7913    1
max_attempts  10.00     NaN  0.00  10.00  10.00  10.00  10.00  10.00   NaN  NaN
lp__         300.28    0.03  1.75 296.05 299.35 300.60 301.58 302.70  3555    1

Samples were drawn using NUTS(diag_e) at Sat Aug  5 22:31:08 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
print('---------------------------- First Pass Regression ranked all data with 0s--------------------------------------------')
[1] "---------------------------- First Pass Regression ranked all data with 0s--------------------------------------------"
print(fit_rank_all)
Inference for Stan model: bivariate_correlation.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

                  mean se_mean       sd      2.5%       25%       50%       75%    97.5% n_eff Rhat
mu[1]          1208.92    0.12    11.63   1185.89   1201.15   1208.92   1216.73   1231.7  9625    1
mu[2]          1764.74    0.04     4.17   1756.59   1761.91   1764.73   1767.55   1773.0 11334    1
sigma[1]        760.33    0.08     8.54    744.01    754.53    760.21    766.08    777.2 10442    1
sigma[2]        284.51    0.03     3.04    278.58    282.45    284.49    286.55    290.4 10325    1
nu               94.06    0.24    23.62     55.71     77.00     91.34    108.22    148.9  9447    1
rho               0.16    0.00     0.02      0.12      0.14      0.16      0.17      0.2  9737    1
cov[1,1]     578171.63  127.33 12985.22 553549.20 569313.77 577913.10 586885.25 603978.7 10400    1
cov[1,2]      34006.07   45.52  4457.59  25228.03  31014.76  34023.27  36996.15  42647.8  9590    1
cov[2,1]      34006.07   45.52  4457.59  25228.03  31014.76  34023.27  36996.15  42647.8  9590    1
cov[2,2]      80956.56   17.04  1731.88  77608.45  79780.12  80933.51  82112.99  84353.1 10326    1
x_rand[1]      1300.25    7.59   683.23    138.65    791.58   1256.01   1761.41   2731.3  8098    1
x_rand[2]      1768.40    3.22   289.99   1196.92   1575.57   1768.07   1959.00   2350.4  8091    1
attempt           0.06    0.00     0.26      0.00      0.00      0.00      0.00      1.0  7886    1
max_attempts     10.00     NaN     0.00     10.00     10.00     10.00     10.00     10.0   NaN  NaN
lp__         -73652.70    0.03     1.73 -73656.85 -73653.64 -73652.38 -73651.42 -73650.3  4295    1

Samples were drawn using NUTS(diag_e) at Wed Aug  9 15:40:36 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
# # FPReg all data
# stan_trace(fit_mreg_all)
# stan_dens(fit_mreg_all, separate_chains = TRUE)
# stan_plot(fit_mreg_all)

# stan_trace(fit_mreg_all_drop0)
# stan_dens(fit_mreg_all_drop0, separate_chains = TRUE)
# stan_plot(fit_mreg_all_drop0)

# # FPReg < 0.3
# stan_trace(fit_mreg_low)
# stan_dens(fit_mreg_low, separate_chains = TRUE)
# stan_plot(fit_mreg_low)
# 
# stan_trace(fit_mreg_low_drop0)
# stan_dens(fit_mreg_low_drop0, separate_chains = TRUE)
# stan_plot(fit_mreg_low_drop0)

# FPReg > 0.3
stan_trace(fit_mreg_high)
'pars' not specified. Showing first 10 parameters by default.

stan_dens(fit_mreg_high, separate_chains = TRUE)
'pars' not specified. Showing first 10 parameters by default.

stan_plot(fit_mreg_high)
'pars' not specified. Showing first 10 parameters by default.
ci_level: 0.8 (80% intervals)
outer_level: 0.95 (95% intervals)

stan_trace(fit_mreg_high_drop0)
'pars' not specified. Showing first 10 parameters by default.

stan_dens(fit_mreg_high_drop0, separate_chains = TRUE)
'pars' not specified. Showing first 10 parameters by default.

stan_plot(fit_mreg_high_drop0)
'pars' not specified. Showing first 10 parameters by default.
ci_level: 0.8 (80% intervals)
outer_level: 0.95 (95% intervals)

print('---------------------------- First Pass Regression all data--------------------------------------------')
[1] "---------------------------- First Pass Regression all data--------------------------------------------"
rho_mreg_all = as.numeric(extract(fit_mreg_all, "rho")[[1]])
mean = mean(rho_mreg_all)
crI = quantile(rho_mreg_all, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_mreg_all), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: 0.1574
HPD: [0.1139, 0.2017]
crI: [0.1134, 0.2014]
print('---------------------------- First Pass Regression all data no 0s--------------------------------------------')
[1] "---------------------------- First Pass Regression all data no 0s--------------------------------------------"
rho_mreg_all_drop0 = as.numeric(extract(fit_mreg_all_drop0, "rho")[[1]])
mean = mean(rho_mreg_all_drop0)
crI = quantile(rho_mreg_all_drop0, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_mreg_all_drop0), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: 0.1843
HPD: [0.1106, 0.2573]
crI: [0.1114, 0.2581]
print('---------------------------- First Pass Regression < 0.3--------------------------------------------')
[1] "---------------------------- First Pass Regression < 0.3--------------------------------------------"
rho_mreg_low = as.numeric(extract(fit_mreg_low, "rho")[[1]])
mean = mean(rho_mreg_low)
crI = quantile(rho_mreg_low, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_mreg_low), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: 0.103
HPD: [0.05775, 0.1468]
crI: [0.05805, 0.1475]
print('---------------------------- First Pass Regression < 0.3 no 0s--------------------------------------------')
[1] "---------------------------- First Pass Regression < 0.3 no 0s--------------------------------------------"
rho_mreg_low_drop0 = as.numeric(extract(fit_mreg_low_drop0, "rho")[[1]])
mean = mean(rho_mreg_low_drop0)
crI = quantile(rho_mreg_low_drop0, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_mreg_low_drop0), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: 0.07362
HPD: [-0.000616, 0.1514]
crI: [-0.003759, 0.1491]
print('---------------------------- First Pass Regression >= 0.3--------------------------------------------')
[1] "---------------------------- First Pass Regression >= 0.3--------------------------------------------"
rho_mreg_high = as.numeric(extract(fit_mreg_high, "rho")[[1]])
mean = mean(rho_mreg_high)
crI = quantile(rho_mreg_high, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_mreg_high), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: 0.4102
HPD: [0.3001, 0.5155]
crI: [0.2992, 0.5146]
print('---------------------------- First Pass Regression >= 0.3 no 0s--------------------------------------------')
[1] "---------------------------- First Pass Regression >= 0.3 no 0s--------------------------------------------"
rho_mreg_high_drop0 = as.numeric(extract(fit_mreg_high_drop0, "rho")[[1]])
mean = mean(rho_mreg_high_drop0)
crI = quantile(rho_mreg_high_drop0, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_mreg_high_drop0), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: 0.514
HPD: [0.3797, 0.6456]
crI: [0.3728, 0.6412]
print('---------------------------- First Pass Regression ranked all with 0s--------------------------------------------')
[1] "---------------------------- First Pass Regression ranked all with 0s--------------------------------------------"
rho_mreg_fit_rank_all = as.numeric(extract(fit_rank_all, "rho")[[1]])
mean = mean(rho_mreg_fit_rank_all)
crI = quantile(rho_mreg_fit_rank_all, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_mreg_fit_rank_all), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: 0.1572
HPD: [0.1164, 0.1953]
crI: [0.1169, 0.196]
print('---------------------------- First Pass Regression all data --------------------------------------------')
[1] "---------------------------- First Pass Regression all data --------------------------------------------"
mallreg_rand <- extract(fit_mreg_all, "x_rand")[[1]]
# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 1), ylim=c(0, 1), type="n",
     xlab = "Eye tracking value", ylab = "MoTR value", main = "FPReg") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color
points(mallreg_rand[,1], mallreg_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(reg_temp_all, pch=16, col="red")

# add dataEllipse with color
dataEllipse(mallreg_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(mallreg_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")


print('---------------------------- First Pass Regression all data no 0s--------------------------------------------')
[1] "---------------------------- First Pass Regression all data no 0s--------------------------------------------"
mallreg_rand_drop0 <- extract(fit_mreg_all_drop0, "x_rand")[[1]]
# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 1), ylim=c(0, 1), type="n",
     xlab = "Eye tracking value", ylab = "MoTR value", main = "FPReg") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color
points(mallreg_rand_drop0[,1], mallreg_rand_drop0[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(reg_temp_all, pch=16, col="red")

# add dataEllipse with color
dataEllipse(mallreg_rand_drop0, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(mallreg_rand_drop0, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")


print('---------------------------- First Pass Regression < 0.3 --------------------------------------------')
[1] "---------------------------- First Pass Regression < 0.3 --------------------------------------------"
mlowreg_rand <- extract(fit_mreg_low, "x_rand")[[1]]
# print(mlowreg_rand)
# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 1), ylim=c(0, 1), type="n",
     xlab = "Eye tracking value", ylab = "MoTR value", main = "FPReg") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color
points(mlowreg_rand[,1], mlowreg_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(reg_temp_low, pch=16, col="red")

# add dataEllipse with color
dataEllipse(mlowreg_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(mlowreg_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")


print('---------------------------- First Pass Regression < 0.3 no 0s --------------------------------------------')
[1] "---------------------------- First Pass Regression < 0.3 no 0s --------------------------------------------"
mlowreg_rand_drop0 <- extract(fit_mreg_low_drop0, "x_rand")[[1]]

# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 1), ylim=c(0, 1), type="n",
     xlab = "Eye tracking value", ylab = "MoTR value", main = "FPReg") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color
points(mlowreg_rand_drop0[,1], mlowreg_rand_drop0[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(reg_temp_low_drop0, pch=16, col="red")

# add dataEllipse with color
dataEllipse(mlowreg_rand_drop0, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(mlowreg_rand_drop0, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")


print('---------------------------- First Pass Regression >= 0.3 --------------------------------------------')
[1] "---------------------------- First Pass Regression >= 0.3 --------------------------------------------"
mhighreg_rand_samples <- extract(fit_mreg_high, "x_rand")[[1]]
# print(mhighreg_rand_samples)
selected_indices <- sample(1:nrow(mhighreg_rand_samples), 900)
mhighreg_rand <- mhighreg_rand_samples[selected_indices, ]
# mhighreg_rand <- extract(fit_mreg_high, "x_rand")[[1]]
# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 1), ylim=c(0, 1), type="n",
     xlab = "Eye tracking value", ylab = "MoTR value", main = "FPReg") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color
points(mhighreg_rand[,1], mhighreg_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(reg_temp_high, pch=16, col="red")

# add dataEllipse with color
dataEllipse(mhighreg_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(mhighreg_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")


print('---------------------------- First Pass Regression >= 0.3 no 0s --------------------------------------------')
[1] "---------------------------- First Pass Regression >= 0.3 no 0s --------------------------------------------"
mhighreg_rand_drop0_samples <- extract(fit_mreg_high_drop0, "x_rand")[[1]]
selected_indices <- sample(1:nrow(mhighreg_rand_drop0_samples), 900)
mhighreg_rand_drop0 <- mhighreg_rand_drop0_samples[selected_indices, ]

# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 1), ylim=c(0, 1), type="n",
     xlab = "Eye tracking value", ylab = "MoTR value", main = "FPReg") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color
points(mhighreg_rand_drop0[,1], mhighreg_rand_drop0[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(reg_temp_high_drop0, pch=16, col="red")

# add dataEllipse with color
dataEllipse(mhighreg_rand_drop0, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(mhighreg_rand_drop0, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")


print('---------------------------- First Pass Regression ranked all data with 0s --------------------------------------------')
[1] "---------------------------- First Pass Regression ranked all data with 0s --------------------------------------------"
mrankreg_rand_samples <- extract(fit_rank_all, "x_rand")[[1]]
selected_indices <- sample(1:nrow(mrankreg_rand_samples), 900)
mrankreg_rand <- mrankreg_rand_samples[selected_indices, ]

# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 3500), ylim=c(0, 3500), type="n",
     xlab = "Eye tracking value", ylab = "MoTR value", main = "FPReg") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color
points(mrankreg_rand[,1], mrankreg_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(reg_temp_rank, pch=16, col="red")

# add dataEllipse with color
dataEllipse(mrankreg_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(mrankreg_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")

model eye tracking to eye tracking correlation


print("Gaze Duration")
[1] "Gaze Duration"
# View(provo_eyetr_grouped_df)

egd_df = provo_eyetr_grouped_df %>% filter(metric == "gaze_duration") %>% #group_by(text_id, metric, measure) %>%
  # summarize(value = mean(value, na.rm = TRUE), .groups = 'drop') %>%
    spread(measure, value) %>%
  # smoothing, if includes 0s
  mutate(eyetr_value_1 =  pmax(value_1, 1),
         eyetr_value_2 = pmax(value_2, 1)
  ) 
print(cor.test(egd_df$eyetr_value_1, egd_df$eyetr_value_2)$estimate)
   cor 
0.9146 
# View(egd_df)

egd_df %>% 
  gather(measure, value, 5:6) %>%
  ggplot(aes(x = value)) +
  geom_density() +
  facet_wrap(~measure, scales = "free") +
  theme_bw() +
  scale_fill_brewer(palette = "Set1")

egd_temp <- egd_df[c("eyetr_value_1", "eyetr_value_2")] %>%
  data.matrix()

# Set up the plotting area with two side-by-side plots
par(mfrow = c(1, 2))

# Plot the first data matrix gd_temp
plot(egd_temp, pch = 16, col = "blue",
     main = "Not Log-Transformed")

egd_data = list(x=egd_temp, N=nrow(egd_temp))

fit_egd = stan(
  file="stan_models/bivariate_correlation.stan", 
  data=egd_data, 
  iter=4000, 
  chains=4, 
  cores=8,
  seed=444,
  # control=list(adapt_delta=0.99), 
  verbose = FALSE
  )

# Save the model 
fit_egd@stanmodel@dso <- new("cxxdso")
saveRDS(fit_egd, file = paste0("eyetr_eyetr_gaze_duration_cor.rds"))
print("Go Past Time")
[1] "Go Past Time"
egpt_df = provo_eyetr_grouped_df %>% filter(metric == "go_past_time") %>% #group_by(text_id, metric, measure) %>%
  # summarize(value = mean(value, na.rm = TRUE), .groups = 'drop') %>%
    spread(measure, value) %>%
  # smoothing, if includes 0s
  mutate(eyetr_value_1 =  pmax(value_1, 1),
         eyetr_value_2 = pmax(value_2, 1)
  ) 
print(cor.test(egpt_df$eyetr_value_1, egpt_df$eyetr_value_2)$estimate)
   cor 
0.9134 
# View(egd_df)

egpt_df %>% 
  gather(measure, value, 5:6) %>%
  ggplot(aes(x = value)) +
  geom_density() +
  facet_wrap(~measure, scales = "free") +
  theme_bw() +
  scale_fill_brewer(palette = "Set1")

egpt_temp <- egpt_df[c("eyetr_value_1", "eyetr_value_2")] %>%
  data.matrix()

# Set up the plotting area with two side-by-side plots
par(mfrow = c(1, 2))

# Plot the first data matrix gd_temp
plot(egpt_temp, pch = 16, col = "blue",
     main = "Not Log-Transformed")

egpt_data = list(x=egpt_temp, N=nrow(egpt_temp))

fit_egpt = stan(
  file="stan_models/bivariate_correlation.stan", 
  data=egpt_data, 
  iter=4000, 
  chains=4, 
  cores=8,
  seed=444,
  # control=list(adapt_delta=0.99), 
  verbose = FALSE
  )

# Save the model 
fit_egpt@stanmodel@dso <- new("cxxdso")
saveRDS(fit_egpt, file = paste0("eyetr_eyetr_go_past_time_cor.rds"))
print("Total Duration")
[1] "Total Duration"
etd_df = provo_eyetr_grouped_df %>% filter(metric == "total_duration") %>% #group_by(text_id, metric, measure) %>%
  # summarize(value = mean(value, na.rm = TRUE), .groups = 'drop') %>%
    spread(measure, value) %>%
  # smoothing, if includes 0s
  mutate(eyetr_value_1 =  pmax(value_1, 1),
         eyetr_value_2 = pmax(value_2, 1)
  ) 
print(cor.test(etd_df$eyetr_value_1, etd_df$eyetr_value_2)$estimate)
   cor 
0.9272 
# View(egd_df)

etd_df %>% 
  gather(measure, value, 5:6) %>%
  ggplot(aes(x = value)) +
  geom_density() +
  facet_wrap(~measure, scales = "free") +
  theme_bw() +
  scale_fill_brewer(palette = "Set1")

etd_temp <- etd_df[c("eyetr_value_1", "eyetr_value_2")] %>%
  data.matrix()

# Set up the plotting area with two side-by-side plots
par(mfrow = c(1, 2))

# Plot the first data matrix gd_temp
plot(etd_temp, pch = 16, col = "blue",
     main = "Total Duration Not Log-Transformed")

etd_data = list(x=etd_temp, N=nrow(etd_temp))

fit_etd = stan(
  file="stan_models/bivariate_correlation.stan", 
  data=etd_data, 
  iter=4000, 
  chains=4, 
  cores=8,
  seed=444,
  # control=list(adapt_delta=0.99), 
  # verbose = FALSE
  )

# Save the model 
fit_etd@stanmodel@dso <- new("cxxdso")
saveRDS(fit_etd, file = paste0("eyetr_eyetr_total_duration_cor.rds"))
print("Fisrt Pass Regression Prob.")
[1] "Fisrt Pass Regression Prob."
ereg_df = provo_eyetr_grouped_df %>% filter(metric == "FPReg") %>% distinct() %>% #group_by(text_id, metric, measure) %>%
  # summarize(value = mean(value)) %>%
  filter(!(row_number() %in% c(443, 444, 445, 446))) %>%
    spread(measure, value) %>%
  # smoothing, if includes 0s
  mutate(eyetr_value_1 =  pmax(value_1, 1e-5),
         eyetr_value_2 = pmax(value_2, 1e-5)
  )
print(cor.test(ereg_df$eyetr_value_1, ereg_df$eyetr_value_2)$estimate)
  cor 
0.741 
# View(egd_df)

ereg_df %>% 
  gather(measure, value, 5:6) %>%
  ggplot(aes(x = value)) +
  geom_density() +
  facet_wrap(~measure, scales = "free") +
  theme_bw() +
  scale_fill_brewer(palette = "Set1")

ereg_temp <- ereg_df[c("eyetr_value_1", "eyetr_value_2")] %>%
  drop_na() %>%
  data.matrix()

# Set up the plotting area with two side-by-side plots
par(mfrow = c(1, 2))

# Plot the first data matrix gd_temp
plot(ereg_temp, pch = 16, col = "blue",
     main = "FPReg Not Log-Transformed")

# -------fit model FPReg ----------

# View(ereg_temp)
ereg_data = list(x=ereg_temp, N=nrow(ereg_temp))
fit_ereg = stan(
  file="stan_models/bivariate_normal_reg.stan", 
  data=ereg_data, 
  iter=4000, 
  chains=4, 
  cores=8,
  seed=444,
  # control=list(adapt_delta=0.99),
  verbose = FALSE
  )

# Save the model 
fit_ereg@stanmodel@dso <- new("cxxdso")
saveRDS(fit_ereg, file = paste0("eyetr_eyetr_FPReg_cor5.rds"))
fit_egd = readRDS("./eyetr_eyetr_gaze_duration_cor.rds")
fit_egpt = readRDS("./eyetr_eyetr_go_past_time_cor.rds")
fit_etd = readRDS("./eyetr_eyetr_total_duration_cor.rds")
fit_ereg = readRDS("./eyetr_eyetr_FPReg_cor.rds")
print('---------------------------- Gaze Duration--------------------------------------------')
[1] "---------------------------- Gaze Duration--------------------------------------------"
print(fit_egd)
Inference for Stan model: bivariate_correlation.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

                  mean se_mean     sd      2.5%       25%       50%       75%     97.5% n_eff Rhat
mu[1]           128.59    0.02   1.11    126.37    127.86    128.61    129.35    130.72  4725    1
mu[2]           118.86    0.01   0.98    116.88    118.20    118.87    119.51    120.76  4981    1
sigma[1]         80.51    0.01   0.90     78.74     79.90     80.52     81.12     82.25  4570    1
sigma[2]         71.27    0.01   0.79     69.71     70.73     71.27     71.80     72.81  4737    1
nu               25.93    0.07   4.93     18.41     22.47     25.17     28.62     37.53  5323    1
rho               0.93    0.00   0.00      0.93      0.93      0.93      0.93      0.94  5350    1
cov[1,1]       6483.12    2.15 145.27   6200.11   6384.78   6483.59   6579.87   6765.15  4571    1
cov[1,2]       5343.14    1.82 117.99   5110.89   5262.31   5342.62   5422.39   5572.98  4180    1
cov[2,1]       5343.14    1.82 117.99   5110.89   5262.31   5342.62   5422.39   5572.98  4180    1
cov[2,2]       5079.72    1.65 113.15   4859.11   5002.72   5079.35   5155.69   5301.71  4730    1
x_rand[1]       142.08    0.85  72.88     19.00     88.95    136.40    189.59    301.58  7381    1
x_rand[2]       130.48    0.76  65.14     20.87     82.14    126.27    171.93    269.53  7385    1
attempt           0.07    0.00   0.28      0.00      0.00      0.00      0.00      1.00  8017    1
max_attempts     10.00     NaN   0.00     10.00     10.00     10.00     10.00     10.00   NaN  NaN
lp__         -53400.86    0.03   1.74 -53405.16 -53401.77 -53400.53 -53399.58 -53398.45  3567    1

Samples were drawn using NUTS(diag_e) at Sat Jul 22 21:28:08 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
print('---------------------------- Go Past Time--------------------------------------------')
[1] "---------------------------- Go Past Time--------------------------------------------"
print(fit_egpt)
Inference for Stan model: bivariate_correlation.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

                  mean se_mean     sd      2.5%       25%       50%       75%     97.5% n_eff Rhat
mu[1]           151.87    0.02   1.54    148.90    150.83    151.88    152.91    154.87  4316    1
mu[2]           139.50    0.02   1.35    136.85    138.58    139.50    140.40    142.16  4309    1
sigma[1]        104.23    0.02   1.38    101.57    103.29    104.23    105.15    106.96  4517    1
sigma[2]         91.29    0.02   1.18     89.01     90.49     91.28     92.10     93.67  4238    1
nu                9.84    0.01   0.97      8.17      9.16      9.77     10.43     12.02  4294    1
rho               0.93    0.00   0.00      0.93      0.93      0.93      0.94      0.94  5682    1
cov[1,1]      10866.34    4.27 286.82  10316.57  10668.36  10863.38  11057.52  11440.23  4514    1
cov[1,2]       8897.70    3.58 230.96   8458.01   8739.41   8893.80   9052.34   9359.86  4154    1
cov[2,1]       8897.70    3.58 230.96   8458.01   8739.41   8893.80   9052.34   9359.86  4154    1
cov[2,2]       8335.83    3.32 215.96   7923.28   8187.73   8331.15   8483.17   8774.46  4239    1
x_rand[1]       171.31    1.07  96.66     19.27    101.02    159.61    228.57    389.14  8093    1
x_rand[2]       156.09    0.95  85.13     18.99     93.98    147.13    208.02    344.02  7994    1
attempt           0.12    0.00   0.37      0.00      0.00      0.00      0.00      1.00  7345    1
max_attempts     10.00     NaN   0.00     10.00     10.00     10.00     10.00     10.00   NaN  NaN
lp__         -55541.43    0.03   1.77 -55545.72 -55542.36 -55541.11 -55540.13 -55539.02  3362    1

Samples were drawn using NUTS(diag_e) at Sat Jul 22 21:52:18 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
print('---------------------------- Total Duration--------------------------------------------')
[1] "---------------------------- Total Duration--------------------------------------------"
print(fit_etd)
Inference for Stan model: bivariate_correlation.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

                  mean se_mean     sd      2.5%       25%       50%       75%     97.5% n_eff Rhat
mu[1]           182.46    0.02   1.40    179.71    181.51    182.43    183.42    185.23  4475    1
mu[2]           163.16    0.02   1.24    160.74    162.32    163.15    164.00    165.56  4552    1
sigma[1]        102.05    0.02   1.18     99.76    101.25    102.05    102.84    104.35  4659    1
sigma[2]         90.80    0.01   1.04     88.77     90.11     90.80     91.49     92.86  4859    1
nu               17.08    0.04   2.46     13.14     15.32     16.80     18.44     22.84  4836    1
rho               0.94    0.00   0.00      0.94      0.94      0.94      0.94      0.95  4836    1
cov[1,1]      10414.71    3.51 240.12   9951.10  10251.81  10414.32  10575.72  10888.84  4667    1
cov[1,2]       8723.92    2.96 197.89   8344.44   8591.58   8725.13   8854.22   9120.77  4456    1
cov[2,1]       8723.92    2.96 197.89   8344.44   8591.58   8725.13   8854.22   9120.77  4456    1
cov[2,2]       8245.86    2.71 189.17   7879.76   8119.40   8245.31   8370.73   8622.71  4862    1
x_rand[1]       197.26    1.10  96.53     32.70    128.21    189.92    257.81    404.81  7760    1
x_rand[2]       176.38    0.99  86.54     30.04    113.27    170.41    230.58    357.63  7701    1
attempt           0.06    0.00   0.25      0.00      0.00      0.00      0.00      1.00  7873    1
max_attempts     10.00     NaN   0.00     10.00     10.00     10.00     10.00     10.00   NaN  NaN
lp__         -55910.26    0.03   1.76 -55914.61 -55911.19 -55909.93 -55908.98 -55907.84  3286    1

Samples were drawn using NUTS(diag_e) at Sat Jul 22 22:21:40 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
print('---------------------------- First Pass Regression Prob.--------------------------------------------')
[1] "---------------------------- First Pass Regression Prob.--------------------------------------------"
print(fit_ereg)
Inference for Stan model: bivariate_normal_reg.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

                 mean se_mean   sd     2.5%      25%      50%      75%    97.5% n_eff Rhat
mu[1]            0.11    0.00 0.00     0.10     0.10     0.11     0.11     0.11  7352    1
mu[2]            0.11    0.00 0.00     0.10     0.11     0.11     0.11     0.11  6993    1
sigma[1]         0.11    0.00 0.00     0.10     0.11     0.11     0.11     0.11  5584    1
sigma[2]         0.10    0.00 0.00     0.10     0.10     0.10     0.10     0.11  5441    1
nu               3.16    0.00 0.13     2.92     3.07     3.16     3.24     3.42  6221    1
rho              0.73    0.00 0.01     0.71     0.73     0.73     0.74     0.76  7209    1
cov[1,1]         0.01    0.00 0.00     0.01     0.01     0.01     0.01     0.01  5581    1
cov[1,2]         0.01    0.00 0.00     0.01     0.01     0.01     0.01     0.01  4877    1
cov[2,1]         0.01    0.00 0.00     0.01     0.01     0.01     0.01     0.01  4877    1
cov[2,2]         0.01    0.00 0.00     0.01     0.01     0.01     0.01     0.01  5442    1
x_rand[1]        0.17    0.00 0.14     0.01     0.08     0.14     0.22     0.47  7543    1
x_rand[2]        0.17    0.00 0.14     0.01     0.08     0.14     0.21     0.46  8201    1
attempt          0.37    0.01 0.70     0.00     0.00     0.00     1.00     2.00  7941    1
max_attempts    10.00     NaN 0.00    10.00    10.00    10.00    10.00    10.00   NaN  NaN
lp__         11696.50    0.03 1.76 11692.31 11695.54 11696.82 11697.81 11698.90  3562    1

Samples were drawn using NUTS(diag_e) at Sun Jul 23 01:21:18 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
# stan_trace(fit_egd, pars=c("rho", "mu", "sigma", "nu"))
# stan_dens(fit_egd, pars=c("rho", "mu", "sigma", "nu"), separate_chains = TRUE)
# stan_plot(fit_egd, pars=c("rho", "mu", "sigma", "nu"))

# Gaze Duration
stan_trace(fit_egd)
stan_dens(fit_egd, separate_chains = TRUE)
stan_plot(fit_egd)

# Go Past Time
stan_trace(fit_egpt)
stan_dens(fit_egpt, separate_chains = TRUE)
stan_plot(fit_egpt)

# Total Duration
stan_trace(fit_etd)
stan_dens(fit_etd, separate_chains = TRUE)
stan_plot(fit_etd)

# FPReg
stan_trace(fit_ereg)
stan_dens(fit_ereg, separate_chains = TRUE)
stan_plot(fit_ereg)
print('---------------------------- Gaze Duration--------------------------------------------')
[1] "---------------------------- Gaze Duration--------------------------------------------"
rho_egd = as.numeric(extract(fit_egd, "rho")[[1]])
mean = mean(rho_egd)
crI = quantile(rho_egd, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_egd), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: 0.9311
HPD: [0.9263, 0.9359]
crI: [0.9262, 0.9358]
print('---------------------------- Go Past Time--------------------------------------------')
[1] "---------------------------- Go Past Time--------------------------------------------"
rho_egpt = as.numeric(extract(fit_egpt, "rho")[[1]])
mean = mean(rho_egpt)
crI = quantile(rho_egpt, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_egpt), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: 0.9349
HPD: [0.9297, 0.9395]
crI: [0.9298, 0.9397]
print('---------------------------- Total Duration--------------------------------------------')
[1] "---------------------------- Total Duration--------------------------------------------"
rho_etd = as.numeric(extract(fit_etd, "rho")[[1]])
mean = mean(rho_etd)
crI = quantile(rho_etd, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_etd), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: 0.9414
HPD: [0.9372, 0.9457]
crI: [0.937, 0.9456]
print('---------------------------- First Pass Regression --------------------------------------------')
[1] "---------------------------- First Pass Regression --------------------------------------------"
rho_ereg = as.numeric(extract(fit_ereg, "rho")[[1]])
mean = mean(rho_ereg)
crI = quantile(rho_ereg, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_ereg), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]")
Mean: 0.7339
HPD: [0.7128, 0.7557]
crI: [0.7119, 0.755]
print('---------------------------- Gaze Duration--------------------------------------------')
[1] "---------------------------- Gaze Duration--------------------------------------------"
egd_rand <- extract(fit_egd, "x_rand")[[1]]
# x_rand_filtered <- x_rand[apply(x_rand, 1, function(x) all(x > 0)),]
# x_rand_filtered

# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 400), ylim=c(0, 700), type="n",
     xlab = "Eye tracking value 1", ylab = "Eye tracking value 2", main = "Gaze Duration") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color 
points(egd_rand[,1], egd_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(egd_temp, pch=16, col="red")

# add dataEllipse with color 
dataEllipse(egd_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(egd_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")


print('---------------------------- Go Past Time--------------------------------------------')
[1] "---------------------------- Go Past Time--------------------------------------------"
egpt_rand <- extract(fit_egpt, "x_rand")[[1]]

# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 800), ylim=c(0, 1200), type="n",
     xlab = "Eye tracking value 1", ylab = "Eye tracking value 2", main = "Go Past Time") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color 
points(egpt_rand[,1], egpt_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(egpt_temp, pch=16, col="red")

# add dataEllipse with color 
dataEllipse(egpt_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(egpt_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")


print('---------------------------- Total Duration--------------------------------------------')
[1] "---------------------------- Total Duration--------------------------------------------"
etd_rand <- extract(fit_etd, "x_rand")[[1]]

# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 800), ylim=c(0, 1200), type="n",
     xlab = "Eye tracking value 1", ylab = "Eye tracking value 2", main = "Total Duration") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color 
points(etd_rand[,1], etd_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(etd_temp, pch=16, col="red")

# add dataEllipse with color 
dataEllipse(etd_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(etd_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")


print('---------------------------- First Pass Regression --------------------------------------------')
[1] "---------------------------- First Pass Regression --------------------------------------------"
ereg_rand <- extract(fit_ereg, "x_rand")[[1]]

# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 1), ylim=c(0, 1), type="n",
     xlab = "Eye tracking value 1", ylab = "Eye tracking value 2", main = "First Pass Regression") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color 
points(ereg_rand[,1], ereg_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(ereg_temp, pch=16, col="red")

# add dataEllipse with color 
dataEllipse(ereg_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(ereg_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")

Bayesian – correlation between MoTR and word level statistics

print("Log Frequency")
[1] "Log Frequency"
stats_cor_df = provo_df %>% filter(metric == "gaze_duration") %>% spread(measure, value)
print(cor.test(stats_cor_df$motr_value, stats_cor_df$freq)$estimate)
    cor 
-0.7454 
print(cor.test(stats_cor_df$eyetr_value, stats_cor_df$freq)$estimate)
    cor 
-0.8069 
# View(stats_cor_df)
stats_cor_df %>% 
  gather(measure, value, c(7, 13)) %>%
  ggplot(aes(x = value)) +
  geom_density() +
  facet_wrap(~measure, scales = "free") +
  theme_bw() +
  scale_fill_brewer(palette = "Set1")

mfreq_temp <- stats_cor_df[c("motr_value", "freq")] %>%
  data.matrix()
efreq_temp <- stats_cor_df[c("eyetr_value", "freq")] %>%
  data.matrix()

# Set up the plotting area with two side-by-side plots
par(mfrow = c(1, 2))

# Plot the first data matrix gd_temp
plot(mfreq_temp, pch = 16, col = "blue",
     main = "MoTR RTs and Word Frequency")

# Plot the first data matrix gd_temp
plot(efreq_temp, pch = 16, col = "blue",
     main = "EyeTR RTs and Word Frequency")

motr & frequency

mfreq_data = list(x=mfreq_temp, N=nrow(mfreq_temp))

fit_mfreq = stan(
  file="stan_models/stats_correlation.stan", 
  data=mfreq_data, 
  iter=4000, 
  chains=4, 
  cores=8,
  seed=444,
  # control=list(adapt_delta=0.99), 
  # verbose = FALSE
  )

# Save the model 
fit_mfreq@stanmodel@dso <- new("cxxdso")
saveRDS(fit_mfreq, file = paste0("motr_freq_cor.rds"))

eyetr & frequency

efreq_data = list(x=efreq_temp, N=nrow(efreq_temp))

fit_efreq = stan(
  file="stan_models/stats_correlation.stan", 
  data=efreq_data, 
  iter=4000, 
  chains=4, 
  cores=8,
  seed=444,
  # control=list(adapt_delta=0.99), 
  # verbose = FALSE
  )

# Save the model 
fit_efreq@stanmodel@dso <- new("cxxdso")
saveRDS(fit_efreq, file = paste0("eyetr_freq_cor.rds"))
print("Length")
[1] "Length"
stats_cor_df = provo_df %>% filter(metric == "gaze_duration") %>% spread(measure, value)
print(cor.test(stats_cor_df$motr_value, stats_cor_df$len)$estimate)
   cor 
0.8644 
print(cor.test(stats_cor_df$eyetr_value, stats_cor_df$len)$estimate)
   cor 
0.8597 
# View(stats_cor_df)
stats_cor_df %>% 
  gather(measure, value, c(9, 13)) %>%
  ggplot(aes(x = value)) +
  geom_density() +
  facet_wrap(~measure, scales = "free") +
  theme_bw() +
  scale_fill_brewer(palette = "Set1")

mlen_temp <- stats_cor_df[c("motr_value", "len")] %>%
  data.matrix()
elen_temp <- stats_cor_df[c("eyetr_value", "len")] %>%
  data.matrix()

# Set up the plotting area with two side-by-side plots
par(mfrow = c(1, 2))

# Plot the first data matrix gd_temp
plot(mlen_temp, pch = 16, col = "blue",
     main = "MoTR RTs and Word Length")

# Plot the first data matrix gd_temp
plot(elen_temp, pch = 16, col = "blue",
     main = "EyeTR RTs and Word Length")

motr & length

mlen_data = list(x=mlen_temp, N=nrow(mlen_temp))

fit_mlen = stan(
  file="stan_models/stats_correlation_len_normal.stan", 
  data=mlen_data, 
  iter=4000, 
  chains=4, 
  cores=8,
  seed=444,
  # control=list(adapt_delta=0.99), 
  # verbose = FALSE
  )

# Save the model 
fit_mlen@stanmodel@dso <- new("cxxdso")
saveRDS(fit_mlen, file = paste0("motr_len_cor2.rds"))

eyetr & length

elen_data = list(x=elen_temp, N=nrow(elen_temp))

fit_elen = stan(
  file="stan_models/stats_correlation_len_normal.stan", 
  data=elen_data, 
  iter=4000, 
  chains=4, 
  cores=8,
  seed=444,
  # control=list(adapt_delta=0.99), 
  # verbose = FALSE
  )

# Save the model 
fit_elen@stanmodel@dso <- new("cxxdso")
saveRDS(fit_elen, file = paste0("eyetr_len_cor.rds"))
print("Surprisal")
[1] "Surprisal"
stats_cor_df = provo_df %>% filter(metric == "gaze_duration") %>% spread(measure, value)
print(cor.test(stats_cor_df$motr_value, stats_cor_df$surp)$estimate)
   cor 
0.4978 
print(cor.test(stats_cor_df$eyetr_value, stats_cor_df$surp)$estimate)
   cor 
0.5683 
# View(stats_cor_df)
stats_cor_df %>% 
  gather(measure, value, c(8, 13)) %>%
  ggplot(aes(x = value)) +
  geom_density() +
  facet_wrap(~measure, scales = "free") +
  theme_bw() +
  scale_fill_brewer(palette = "Set1")

msurp_temp <- stats_cor_df[c("motr_value", "surp")] %>%
  data.matrix()
esurp_temp <- stats_cor_df[c("eyetr_value", "surp")] %>%
  data.matrix()

# Set up the plotting area with two side-by-side plots
par(mfrow = c(1, 2))

# Plot the first data matrix gd_temp
plot(msurp_temp, pch = 16, col = "blue",
     main = "MoTR RTs and Surprisal")

# Plot the first data matrix gd_temp
plot(esurp_temp, pch = 16, col = "blue",
     main = "EyeTR RTs and Surprisal")

motr & surprisal

msurp_data = list(x=msurp_temp, N=nrow(msurp_temp))

fit_msurp = stan(
  file="stan_models/stats_correlation.stan", 
  data=msurp_data, 
  iter=4000, 
  chains=4, 
  cores=8,
  seed=444,
  # control=list(adapt_delta=0.99), 
  # verbose = FALSE
  )

# Save the model 
fit_msurp@stanmodel@dso <- new("cxxdso")
saveRDS(fit_msurp, file = paste0("motr_surp_cor.rds"))

eyetr & surprisal

esurp_data = list(x=esurp_temp, N=nrow(esurp_temp))

fit_esurp = stan(
  file="stan_models/stats_correlation.stan", 
  data=esurp_data, 
  iter=4000, 
  chains=4, 
  cores=8,
  seed=444,
  # control=list(adapt_delta=0.99), 
  # verbose = FALSE
  )

# Save the model 
fit_esurp@stanmodel@dso <- new("cxxdso")
saveRDS(fit_esurp, file = paste0("eyetr_surp_cor.rds"))
fit_mfreq = readRDS("./motr_freq_cor.rds")
fit_efreq = readRDS("./eyetr_freq_cor.rds")
fit_mlen = readRDS("./motr_len_cor.rds")
fit_elen = readRDS("./eyetr_len_cor.rds")
fit_msurp = readRDS("./motr_surp_cor.rds")
fit_esurp = readRDS("./eyetr_surp_cor.rds")

print('---------------------------- MoTR & Log Frequency --------------------------------------------')
[1] "---------------------------- MoTR & Log Frequency --------------------------------------------"
print(fit_mfreq)
Inference for Stan model: stats_correlation.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

                  mean se_mean     sd      2.5%       25%       50%       75%     97.5% n_eff Rhat
mu[1]           206.16    0.02   1.93    202.44    204.86    206.17    207.47    209.88  8522    1
mu[2]             5.80    0.00   0.02      5.77      5.79      5.80      5.81      5.84  8983    1
sigma[1]        138.91    0.02   1.50    136.02    137.87    138.92    139.91    141.86  8278    1
sigma[2]          1.34    0.00   0.01      1.32      1.33      1.34      1.35      1.37  8274    1
nu               99.82    0.24  23.02     62.37     83.46     97.35    113.85    150.17  9319    1
rho              -0.76    0.00   0.01     -0.78     -0.77     -0.76     -0.76     -0.75  8377    1
cov[1,1]      19299.02    4.59 417.70  18501.76  19006.99  19298.28  19575.75  20123.93  8268    1
cov[1,2]       -141.93    0.04   3.34   -148.59   -144.18   -141.93   -139.65   -135.44  6864    1
cov[2,1]       -141.93    0.04   3.34   -148.59   -144.18   -141.93   -139.65   -135.44  6864    1
cov[2,2]          1.80    0.00   0.04      1.73      1.78      1.80      1.83      1.87  8265    1
x_rand[1]       227.30    1.38 121.53     20.78    136.69    221.29    306.64    484.97  7799    1
x_rand[2]         5.66    0.01   1.26      3.09      4.82      5.70      6.53      8.03  8041    1
attempt           0.07    0.00   0.27      0.00      0.00      0.00      0.00      1.00  7926    1
max_attempts     10.00     NaN   0.00     10.00     10.00     10.00     10.00     10.00   NaN  NaN
lp__         -36159.81    0.03   1.73 -36164.02 -36160.74 -36159.48 -36158.53 -36157.45  3770    1

Samples were drawn using NUTS(diag_e) at Sun Jul 23 15:18:27 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
print('---------------------------- EyeTR & Log Frequency --------------------------------------------')
[1] "---------------------------- EyeTR & Log Frequency --------------------------------------------"
print(fit_efreq)
Inference for Stan model: stats_correlation.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

                  mean se_mean     sd      2.5%       25%       50%       75%     97.5% n_eff Rhat
mu[1]           129.58    0.01   0.95    127.71    128.96    129.59    130.21    131.45  7967    1
mu[2]             5.79    0.00   0.02      5.75      5.78      5.79      5.80      5.82  8371    1
sigma[1]         73.11    0.01   0.75     71.66     72.60     73.10     73.61     74.61  7440    1
sigma[2]          1.34    0.00   0.01      1.31      1.33      1.34      1.35      1.36  7478    1
nu               91.76    0.24  21.94     56.83     76.18     89.08    104.50    142.84  8551    1
rho              -0.82    0.00   0.01     -0.83     -0.82     -0.82     -0.81     -0.81  8039    1
cov[1,1]       5345.65    1.28 110.19   5134.97   5270.29   5343.14   5418.78   5566.32  7432    1
cov[1,2]        -80.04    0.02   1.70    -83.43    -81.17    -80.03    -78.89    -76.73  6431    1
cov[2,1]        -80.04    0.02   1.70    -83.43    -81.17    -80.03    -78.89    -76.73  6431    1
cov[2,2]          1.79    0.00   0.04      1.72      1.77      1.79      1.81      1.86  7476    1
x_rand[1]       137.10    0.77  67.73     16.30     87.55    134.62    182.36    275.36  7640    1
x_rand[2]         5.68    0.01   1.27      3.13      4.82      5.68      6.55      8.11  7779    1
attempt           0.04    0.00   0.19      0.00      0.00      0.00      0.00      1.00  8076    1
max_attempts     10.00     NaN   0.00     10.00     10.00     10.00     10.00     10.00   NaN  NaN
lp__         -32784.74    0.03   1.72 -32789.05 -32785.64 -32784.43 -32783.48 -32782.37  4038    1

Samples were drawn using NUTS(diag_e) at Sun Jul 23 15:44:55 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
print('---------------------------- MoTR & Length --------------------------------------------')
[1] "---------------------------- MoTR & Length --------------------------------------------"
print(fit_mlen)
Inference for Stan model: stats_correlation_len_normal.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

                  mean se_mean     sd      2.5%       25%       50%       75%     97.5% n_eff Rhat
mu[1]           197.87    0.03   2.04    193.81    196.48    197.88    199.27    201.86  4675    1
mu[2]             4.40    0.00   0.04      4.33      4.38      4.40      4.43      4.48  4776    1
sigma[1]        136.99    0.03   1.75    133.57    135.79    136.99    138.19    140.43  4848    1
sigma[2]          2.51    0.00   0.03      2.45      2.49      2.51      2.53      2.58  4665    1
nu               17.03    0.04   2.84     12.51     15.05     16.64     18.61     23.71  4796    1
rho               0.89    0.00   0.00      0.88      0.88      0.89      0.89      0.89  5940    1
cov[1,1]      18768.69    6.88 479.04  17841.00  18438.93  18766.08  19096.47  19721.77  4845    1
cov[1,2]        305.06    0.12   7.91    289.81    299.65    305.00    310.39    320.87  4341    1
cov[2,1]        305.06    0.12   7.91    289.81    299.65    305.00    310.39    320.87  4341    1
cov[2,2]          6.31    0.00   0.17      5.98      6.19      6.30      6.42      6.64  4664    1
x_rand[1]       219.00    1.39 122.76     20.11    127.61    208.39    297.11    488.02  7751    1
x_rand[2]         5.26    0.03   2.36      1.00      4.00      5.00      7.00     10.00  7861    1
attempt           0.10    0.00   0.33      0.00      0.00      0.00      0.00      1.00  7797    1
max_attempts     10.00     NaN   0.00     10.00     10.00     10.00     10.00     10.00   NaN  NaN
lp__         -38437.19    0.03   1.75 -38441.43 -38438.10 -38436.86 -38435.92 -38434.79  3210    1

Samples were drawn using NUTS(diag_e) at Sun Jul 23 19:35:18 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
print('---------------------------- EyeTR & Length --------------------------------------------')
[1] "---------------------------- EyeTR & Length --------------------------------------------"
print(fit_elen)
Inference for Stan model: stats_correlation_len_normal.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

                  mean se_mean     sd      2.5%       25%       50%       75%     97.5% n_eff Rhat
mu[1]           125.47    0.01   1.05    123.48    124.75    125.46    126.18    127.53  5037    1
mu[2]             4.45    0.00   0.04      4.38      4.43      4.45      4.48      4.52  4809    1
sigma[1]         72.58    0.01   0.88     70.87     71.98     72.57     73.15     74.31  4816    1
sigma[2]          2.49    0.00   0.03      2.42      2.47      2.49      2.51      2.55  4786    1
nu               17.29    0.04   2.69     13.08     15.35     16.97     18.80     23.46  4894    1
rho               0.88    0.00   0.00      0.87      0.88      0.88      0.89      0.89  5800    1
cov[1,1]       5268.20    1.84 127.51   5022.34   5181.60   5266.78   5351.59   5522.02  4819    1
cov[1,2]        159.48    0.06   3.98    151.79    156.77    159.44    162.13    167.48  4232    1
cov[2,1]        159.48    0.06   3.98    151.79    156.77    159.44    162.13    167.48  4232    1
cov[2,2]          6.19    0.00   0.16      5.88      6.08      6.19      6.30      6.51  4790    1
x_rand[1]       135.19    0.75  67.87     18.34     85.18    132.06    179.13    278.49  8296    1
x_rand[2]         5.29    0.03   2.41      1.00      4.00      5.00      7.00     10.00  8133    1
attempt           0.06    0.00   0.24      0.00      0.00      0.00      0.00      1.00  7560    1
max_attempts     10.00     NaN   0.00     10.00     10.00     10.00     10.00     10.00   NaN  NaN
lp__         -35403.80    0.03   1.76 -35408.14 -35404.73 -35403.49 -35402.51 -35401.38  3435    1

Samples were drawn using NUTS(diag_e) at Sun Jul 23 19:55:18 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
print('---------------------------- MoTR & Surprisal --------------------------------------------')
[1] "---------------------------- MoTR & Surprisal --------------------------------------------"
print(fit_msurp)
Inference for Stan model: stats_correlation.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

                  mean se_mean     sd      2.5%       25%       50%       75%     97.5% n_eff Rhat
mu[1]           193.29    0.02   2.22    189.00    191.80    193.27    194.83    197.56  7883    1
mu[2]             6.02    0.00   0.08      5.86      5.97      6.02      6.08      6.19  8202    1
sigma[1]        135.56    0.02   1.87    132.03    134.29    135.53    136.83    139.29  6733    1
sigma[2]          5.10    0.00   0.08      4.95      5.05      5.10      5.15      5.25  6738    1
nu               11.72    0.02   1.35      9.45     10.76     11.58     12.56     14.76  6506    1
rho               0.57    0.00   0.01      0.54      0.56      0.57      0.58      0.60  7907    1
cov[1,1]      18380.00    6.19 508.20  17430.66  18032.66  18367.66  18723.49  19401.81  6740    1
cov[1,2]        396.36    0.20  15.81    365.40    385.79    396.30    407.09    427.00  6245    1
cov[2,1]        396.36    0.20  15.81    365.40    385.79    396.30    407.09    427.00  6245    1
cov[2,2]         25.98    0.01   0.78     24.50     25.45     25.98     26.51     27.56  6750    1
x_rand[1]       229.82    1.41 125.86     23.36    137.77    220.32    308.08    504.67  7929    1
x_rand[2]         7.63    0.05   4.51      0.66      4.30      7.12     10.37     17.97  7826    1
attempt           0.21    0.01   0.51      0.00      0.00      0.00      0.00      2.00  7854    1
max_attempts     10.00     NaN   0.00     10.00     10.00     10.00     10.00     10.00   NaN  NaN
lp__         -43211.31    0.03   1.76 -43215.70 -43212.20 -43210.97 -43210.02 -43208.89  3913    1

Samples were drawn using NUTS(diag_e) at Sun Jul 23 20:47:52 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
print('---------------------------- EyeTR & Surprisal --------------------------------------------')
[1] "---------------------------- EyeTR & Surprisal --------------------------------------------"
print(fit_esurp)
Inference for Stan model: stats_correlation.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

                  mean se_mean     sd      2.5%       25%       50%       75%     97.5% n_eff Rhat
mu[1]           123.52    0.01   1.17    121.28    122.73    123.52    124.30    125.81  7205    1
mu[2]             6.14    0.00   0.08      5.97      6.08      6.13      6.19      6.30  7266    1
sigma[1]         72.79    0.01   0.95     70.95     72.15     72.77     73.43     74.64  6894    1
sigma[2]          5.16    0.00   0.07      5.01      5.11      5.16      5.21      5.30  5938    1
nu               14.77    0.03   1.97     11.49     13.38     14.56     15.97     19.18  5988    1
rho               0.63    0.00   0.01      0.61      0.62      0.63      0.64      0.66  8585    1
cov[1,1]       5299.28    1.66 138.13   5033.28   5205.63   5295.99   5392.41   5571.18  6894    1
cov[1,2]        237.27    0.11   8.26    221.19    231.62    237.24    242.84    253.80  6152    1
cov[2,1]        237.27    0.11   8.26    221.19    231.62    237.24    242.84    253.80  6152    1
cov[2,2]         26.59    0.01   0.77     25.10     26.07     26.58     27.11     28.14  5952    1
x_rand[1]       141.12    0.80  69.27     22.01     91.25    136.11    184.96    290.51  7508    1
x_rand[2]         7.68    0.05   4.55      0.67      4.31      7.15     10.45     17.96  7265    1
attempt           0.17    0.00   0.45      0.00      0.00      0.00      0.00      1.00  8132    1
max_attempts     10.00     NaN   0.00     10.00     10.00     10.00     10.00     10.00   NaN  NaN
lp__         -40032.38    0.03   1.76 -40036.66 -40033.33 -40032.04 -40031.08 -40029.99  3594    1

Samples were drawn using NUTS(diag_e) at Sun Jul 23 21:06:56 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
# MoTR & Log Freq
stan_trace(fit_mfreq)
stan_dens(fit_mfreq, separate_chains = TRUE)
stan_plot(fit_mfreq)

# EyeTR & Log Freq
stan_trace(fit_efreq)
stan_dens(fit_efreq, separate_chains = TRUE)
stan_plot(fit_efreq)

# MoTR & Len
stan_trace(fit_mlen)
stan_dens(fit_mlen, separate_chains = TRUE)
stan_plot(fit_mlen)

# EyeTR & Len
stan_trace(fit_elen)
stan_dens(fit_elen, separate_chains = TRUE)
stan_plot(fit_elen)

# MoTR & Surprisal
stan_trace(fit_msurp)
stan_dens(fit_msurp, separate_chains = TRUE)
stan_plot(fit_msurp)

# EyeTR & Surprisal
stan_trace(fit_esurp)
stan_dens(fit_esurp, separate_chains = TRUE)
stan_plot(fit_esurp)
print('---------------------------- MoTR & Log Freq --------------------------------------------')
[1] "---------------------------- MoTR & Log Freq --------------------------------------------"
rho_mfreq = as.numeric(extract(fit_mfreq, "rho")[[1]])
mean = mean(rho_mfreq)
crI = quantile(rho_mfreq, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_mfreq), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: -0.7613
HPD: [-0.776, -0.7461]
crI: [-0.7762, -0.7462]
print('---------------------------- EyeTR & Log Freq --------------------------------------------')
[1] "---------------------------- EyeTR & Log Freq --------------------------------------------"
rho_efreq = as.numeric(extract(fit_efreq, "rho")[[1]])
mean = mean(rho_efreq)
crI = quantile(rho_efreq, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_efreq), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: -0.8182
HPD: [-0.8297, -0.8065]
crI: [-0.8295, -0.8062]
print('---------------------------- MoTR & Length --------------------------------------------')
[1] "---------------------------- MoTR & Length --------------------------------------------"
rho_mlen = as.numeric(extract(fit_mlen, "rho")[[1]])
mean = mean(rho_mlen)
crI = quantile(rho_mlen, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_mlen), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: 0.8867
HPD: [0.8784, 0.8943]
crI: [0.8784, 0.8943]
print('---------------------------- EyeTR & Length --------------------------------------------')
[1] "---------------------------- EyeTR & Length --------------------------------------------"
rho_elen = as.numeric(extract(fit_elen, "rho")[[1]])
mean = mean(rho_elen)
crI = quantile(rho_elen, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_elen), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: 0.883
HPD: [0.8743, 0.8908]
crI: [0.8746, 0.8911]
print('---------------------------- MoTR & Surprisal --------------------------------------------')
[1] "---------------------------- MoTR & Surprisal --------------------------------------------"
rho_msurp = as.numeric(extract(fit_msurp, "rho")[[1]])
mean = mean(rho_msurp)
crI = quantile(rho_msurp, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_msurp), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: 0.5735
HPD: [0.5447, 0.6033]
crI: [0.5432, 0.602]
print('---------------------------- EyeTR & Surprisal --------------------------------------------')
[1] "---------------------------- EyeTR & Surprisal --------------------------------------------"
rho_esurp = as.numeric(extract(fit_esurp, "rho")[[1]])
mean = mean(rho_esurp)
crI = quantile(rho_esurp, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_esurp), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]")
Mean: 0.632
HPD: [0.6075, 0.6574]
crI: [0.6066, 0.6569]
print('---------------------------- MoTR & Log Frequency--------------------------------------------')
[1] "---------------------------- MoTR & Log Frequency--------------------------------------------"
mfreq_rand <- extract(fit_mfreq, "x_rand")[[1]]

# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 800), ylim=c(0, 12), type="n",
     xlab = "MoTR value", ylab = "Log Frequency", main = "Gaze Duration") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color 
points(mfreq_rand[,1], mfreq_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(mfreq_temp, pch=16, col="red")

# add dataEllipse with color 
dataEllipse(mfreq_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(mfreq_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")


print('---------------------------- EyeTR & Log Frequency--------------------------------------------')
[1] "---------------------------- EyeTR & Log Frequency--------------------------------------------"
efreq_rand <- extract(fit_efreq, "x_rand")[[1]]

# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 500), ylim=c(0, 12), type="n",
     xlab = "Eye tracking value", ylab = "Log Frequency", main = "Gaze Duration") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color 
points(efreq_rand[,1], efreq_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(efreq_temp, pch=16, col="red")

# add dataEllipse with color 
dataEllipse(efreq_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(efreq_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")


print('---------------------------- MoTR & Length --------------------------------------------')
[1] "---------------------------- MoTR & Length --------------------------------------------"
mlen_rand <- extract(fit_mlen, "x_rand")[[1]]
# mlen_rand

# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 800), ylim=c(0, 20), type="n",
     xlab = "MoTR value", ylab = "Word Length", main = "Gaze Duration") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color 
points(mlen_rand[,1], mlen_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(mlen_temp, pch=16, col="red")

# add dataEllipse with color 
dataEllipse(mlen_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(mlen_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")


print('---------------------------- EyeTR & Length --------------------------------------------')
[1] "---------------------------- EyeTR & Length --------------------------------------------"
elen_rand <- extract(fit_elen, "x_rand")[[1]]
# elen_rand

# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 800), ylim=c(0, 20), type="n",
     xlab = "EyeTR value", ylab = "Word Length", main = "Gaze Duration") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color 
points(elen_rand[,1], elen_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(elen_temp, pch=16, col="red")

# add dataEllipse with color 
dataEllipse(elen_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(elen_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")


print('---------------------------- MoTR & Surprisal --------------------------------------------')
[1] "---------------------------- MoTR & Surprisal --------------------------------------------"
msurp_rand <- extract(fit_msurp, "x_rand")[[1]]

# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 800), ylim=c(0, 20), type="n",
     xlab = "MoTR value", ylab = "Word Surprisal", main = "Gaze Duration") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color 
points(msurp_rand [,1], msurp_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(msurp_temp, pch=16, col="red")

# add dataEllipse with color 
dataEllipse(msurp_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(msurp_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")


print('---------------------------- EyeTR & Surprisal --------------------------------------------')
[1] "---------------------------- EyeTR & Surprisal --------------------------------------------"
esurp_rand <- extract(fit_esurp, "x_rand")[[1]]

# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 800), ylim=c(0, 20), type="n",
     xlab = "EyeTR value", ylab = "Word Surprisal", main = "Gaze Duration") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color 
points(esurp_rand [,1], esurp_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(esurp_temp, pch=16, col="red")

# add dataEllipse with color 
dataEllipse(esurp_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(esurp_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")

print("EyeTR vs. EyeTR Fisrt Pass Regression Prob. < 0.3 ")
[1] "EyeTR vs. EyeTR Fisrt Pass Regression Prob. < 0.3 "
ereg_df = provo_eyetr_grouped_df %>% filter(metric == "FPReg") %>% distinct() %>% #group_by(text_id, metric, measure) %>%
  # summarize(value = mean(value)) %>%
  filter(!(row_number() %in% c(443, 444, 445, 446))) %>%
    spread(measure, value) %>%
  # smoothing, if includes 0s
  mutate(eyetr_value_1 =  pmax(value_1, 1e-5),
         eyetr_value_2 = pmax(value_2, 1e-5))

ereg_df_low = provo_eyetr_grouped_df %>% filter(metric == "FPReg") %>% distinct() %>% #group_by(text_id, metric, measure) %>%
  # summarize(value = mean(value)) %>%
  filter(!(row_number() %in% c(443, 444, 445, 446))) %>%
    spread(measure, value) %>%
  # smoothing, if includes 0s
  mutate(eyetr_value_1 =  pmax(value_1, 1e-5),
         eyetr_value_2 = pmax(value_2, 1e-5)) %>%
  filter(eyetr_value_1 < 0.3)
# View(ereg_df_low)

ereg_df_high = provo_eyetr_grouped_df %>% filter(metric == "FPReg") %>% distinct() %>% #group_by(text_id, metric, measure) %>%
  # summarize(value = mean(value)) %>%
  filter(!(row_number() %in% c(443, 444, 445, 446))) %>%
    spread(measure, value) %>%
  # smoothing, if includes 0s
  mutate(eyetr_value_1 =  pmax(value_1, 1e-5),
         eyetr_value_2 = pmax(value_2, 1e-5)) %>%
  filter(eyetr_value_1 >= 0.3)
# View(ereg_df_high) 

print(cor.test(ereg_df$eyetr_value_1, ereg_df$eyetr_value_2)$estimate)
  cor 
0.741 
print(cor.test(ereg_df$eyetr_value_1, ereg_df$eyetr_value_2)$p.value)
[1] 0
print(cor.test(ereg_df_low$eyetr_value_1, ereg_df_low$eyetr_value_2)$estimate)
   cor 
0.4586 
print(cor.test(ereg_df_low$eyetr_value_1, ereg_df_low$eyetr_value_2)$p.value)
[1] 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000293
print(cor.test(ereg_df_high$eyetr_value_1, ereg_df_high$eyetr_value_2)$estimate)
   cor 
0.6653 
print(cor.test(ereg_df_high$eyetr_value_1, ereg_df_high$eyetr_value_2)$p.value)
[1] 0.000000000000000000000000000000000000000002144
# View(egd_df)

ereg_df %>% 
  gather(measure, value, 5:6) %>%
  ggplot(aes(x = value)) +
  geom_density() +
  facet_wrap(~measure, scales = "free") +
  theme_bw() +
  scale_fill_brewer(palette = "Set1")

ereg_temp <- ereg_df[c("eyetr_value_1", "eyetr_value_2")] %>%
  drop_na() %>%
  data.matrix()
ereg_temp_low <- ereg_df_low[c("eyetr_value_1", "eyetr_value_2")] %>%
  drop_na() %>%
  data.matrix()
ereg_temp_high <- ereg_df_high[c("eyetr_value_1", "eyetr_value_2")] %>%
  drop_na() %>%
  data.matrix()

# Set up the plotting area with two side-by-side plots
par(mfrow = c(1, 3))

# Plot the first data matrix gd_temp
plot(ereg_temp, pch = 16, col = "blue",
     main = "FPReg all data Not Log-Transformed")
plot(ereg_temp_low, pch = 16, col = "blue",
     main = "FPReg < 0.3 Not Log-Transformed")
plot(ereg_temp_high, pch = 16, col = "blue",
     main = "FPReg > 0.3 Not Log-Transformed")

# -------fit model eyetr vs. eyetr FPReg <0.3 & >=0.3 ----------
reg_data = list(x=ereg_temp, N=nrow(ereg_temp))
fit_reg = stan(
  # file="stan_models/bivariate_beta_correlation_reg.stan", 
  file = "stan_models/bivariate_normal_reg.stan",
  data=reg_data, 
  iter=4000, 
  chains=4, 
  cores=4,
  seed=444,
  # control=list(adapt_delta=0.99), 
  verbose = FALSE
  )

# Save the model 
fit_reg@stanmodel@dso <- new("cxxdso")
saveRDS(fit_reg, file = paste0("eyetr_eyetr_FPReg_cor_all_data.rds"))
# fit_ereg_all = readRDS("./eyetr_eyetr_FPReg_cor_all_data.rds")
fit_ereg_all = readRDS("././eyetr_eyetr_FPReg_cor.rds")
fit_ereg_low = readRDS("./eyetr_eyetr_FPReg_cor_00-03.rds")
fit_ereg_high = readRDS("./eyetr_eyetr_FPReg_cor_03-1.rds")

print('---------------------------- First Pass Regression Prob. all data --------------------------------------------')
[1] "---------------------------- First Pass Regression Prob. all data --------------------------------------------"
print(fit_ereg_all)
Inference for Stan model: bivariate_normal_reg.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

                 mean se_mean   sd     2.5%      25%      50%      75%    97.5% n_eff Rhat
mu[1]            0.11    0.00 0.00     0.10     0.10     0.11     0.11     0.11  7352    1
mu[2]            0.11    0.00 0.00     0.10     0.11     0.11     0.11     0.11  6993    1
sigma[1]         0.11    0.00 0.00     0.10     0.11     0.11     0.11     0.11  5584    1
sigma[2]         0.10    0.00 0.00     0.10     0.10     0.10     0.10     0.11  5441    1
nu               3.16    0.00 0.13     2.92     3.07     3.16     3.24     3.42  6221    1
rho              0.73    0.00 0.01     0.71     0.73     0.73     0.74     0.76  7209    1
cov[1,1]         0.01    0.00 0.00     0.01     0.01     0.01     0.01     0.01  5581    1
cov[1,2]         0.01    0.00 0.00     0.01     0.01     0.01     0.01     0.01  4877    1
cov[2,1]         0.01    0.00 0.00     0.01     0.01     0.01     0.01     0.01  4877    1
cov[2,2]         0.01    0.00 0.00     0.01     0.01     0.01     0.01     0.01  5442    1
x_rand[1]        0.17    0.00 0.14     0.01     0.08     0.14     0.22     0.47  7543    1
x_rand[2]        0.17    0.00 0.14     0.01     0.08     0.14     0.21     0.46  8201    1
attempt          0.37    0.01 0.70     0.00     0.00     0.00     1.00     2.00  7941    1
max_attempts    10.00     NaN 0.00    10.00    10.00    10.00    10.00    10.00   NaN  NaN
lp__         11696.50    0.03 1.76 11692.31 11695.54 11696.82 11697.81 11698.90  3562    1

Samples were drawn using NUTS(diag_e) at Sun Jul 23 01:21:18 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
print('---------------------------- First Pass Regression Prob.< 0.3--------------------------------------------')
[1] "---------------------------- First Pass Regression Prob.< 0.3--------------------------------------------"
print(fit_ereg_low)
Inference for Stan model: bivariate_normal_reg.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

                mean se_mean   sd    2.5%     25%     50%     75%   97.5% n_eff Rhat
mu[1]           0.11    0.00 0.00    0.11    0.11    0.11    0.11    0.12  7590    1
mu[2]           0.12    0.00 0.00    0.12    0.12    0.12    0.12    0.12  6828    1
sigma[1]        0.08    0.00 0.00    0.07    0.08    0.08    0.08    0.08  7489    1
sigma[2]        0.09    0.00 0.00    0.08    0.08    0.09    0.09    0.09  6449    1
nu             24.44    0.08 6.00   16.09   20.27   23.37   27.29   39.52  5520    1
rho             0.47    0.00 0.02    0.44    0.46    0.47    0.49    0.51  8485    1
cov[1,1]        0.01    0.00 0.00    0.01    0.01    0.01    0.01    0.01  7484    1
cov[1,2]        0.00    0.00 0.00    0.00    0.00    0.00    0.00    0.00  6928    1
cov[2,1]        0.00    0.00 0.00    0.00    0.00    0.00    0.00    0.00  6928    1
cov[2,2]        0.01    0.00 0.00    0.01    0.01    0.01    0.01    0.01  6439    1
x_rand[1]       0.13    0.00 0.07    0.01    0.08    0.12    0.17    0.28  7848    1
x_rand[2]       0.14    0.00 0.08    0.01    0.08    0.13    0.19    0.31  7951    1
attempt         0.17    0.00 0.44    0.00    0.00    0.00    0.00    1.00  7714    1
max_attempts   10.00     NaN 0.00   10.00   10.00   10.00   10.00   10.00   NaN  NaN
lp__         7720.01    0.03 1.74 7715.76 7719.08 7720.31 7721.28 7722.38  3981    1

Samples were drawn using NUTS(diag_e) at Sun Aug  6 00:32:16 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
print('---------------------------- First Pass Regression Prob.>= 0.3--------------------------------------------')
[1] "---------------------------- First Pass Regression Prob.>= 0.3--------------------------------------------"
print(fit_ereg_high)
Inference for Stan model: bivariate_normal_reg.
4 chains, each with iter=4000; warmup=2000; thin=1; 
post-warmup draws per chain=2000, total post-warmup draws=8000.

               mean se_mean    sd   2.5%    25%    50%    75%  97.5% n_eff Rhat
mu[1]          0.44    0.00  0.01   0.43   0.44   0.44   0.45   0.46  5432    1
mu[2]          0.37    0.00  0.01   0.35   0.36   0.37   0.38   0.39  6127    1
sigma[1]       0.12    0.00  0.01   0.11   0.11   0.12   0.12   0.13  5531    1
sigma[2]       0.16    0.00  0.01   0.15   0.16   0.16   0.17   0.18  5479    1
nu            28.02    0.17 12.90  11.34  18.95  25.20  34.27  60.04  6081    1
rho            0.67    0.00  0.03   0.60   0.65   0.67   0.69   0.73  6652    1
cov[1,1]       0.01    0.00  0.00   0.01   0.01   0.01   0.01   0.02  5539    1
cov[1,2]       0.01    0.00  0.00   0.01   0.01   0.01   0.01   0.02  4763    1
cov[2,1]       0.01    0.00  0.00   0.01   0.01   0.01   0.01   0.02  4763    1
cov[2,2]       0.03    0.00  0.00   0.02   0.02   0.03   0.03   0.03  5491    1
x_rand[1]      0.44    0.00  0.12   0.21   0.36   0.45   0.53   0.68  7922    1
x_rand[2]      0.38    0.00  0.16   0.08   0.26   0.37   0.48   0.71  8307    1
attempt        0.02    0.00  0.13   0.00   0.00   0.00   0.00   0.00  8124    1
max_attempts  10.00     NaN  0.00  10.00  10.00  10.00  10.00  10.00   NaN  NaN
lp__         793.27    0.03  1.79 788.73 792.39 793.63 794.56 795.67  3841    1

Samples were drawn using NUTS(diag_e) at Sun Aug  6 00:36:26 2023.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
# # FPReg all data
stan_trace(fit_ereg_all)
'pars' not specified. Showing first 10 parameters by default.

stan_dens(fit_ereg_all, separate_chains = TRUE)
'pars' not specified. Showing first 10 parameters by default.

stan_plot(fit_ereg_all)
'pars' not specified. Showing first 10 parameters by default.
ci_level: 0.8 (80% intervals)
outer_level: 0.95 (95% intervals)

# # FPReg < 0.3
stan_trace(fit_ereg_low)
'pars' not specified. Showing first 10 parameters by default.

stan_dens(fit_ereg_low, separate_chains = TRUE)
'pars' not specified. Showing first 10 parameters by default.

stan_plot(fit_ereg_low)
'pars' not specified. Showing first 10 parameters by default.
ci_level: 0.8 (80% intervals)
outer_level: 0.95 (95% intervals)

# FPReg >= 0.3
stan_trace(fit_ereg_high)
'pars' not specified. Showing first 10 parameters by default.

stan_dens(fit_ereg_high, separate_chains = TRUE)
'pars' not specified. Showing first 10 parameters by default.

stan_plot(fit_ereg_high)
'pars' not specified. Showing first 10 parameters by default.
ci_level: 0.8 (80% intervals)
outer_level: 0.95 (95% intervals)

print('---------------------------- First Pass Regression all data--------------------------------------------')
[1] "---------------------------- First Pass Regression all data--------------------------------------------"
rho_ereg_all = as.numeric(extract(fit_ereg_all, "rho")[[1]])
mean = mean(rho_ereg_all)
crI = quantile(rho_ereg_all, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_ereg_all), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: 0.7339
HPD: [0.7128, 0.7557]
crI: [0.7119, 0.755]
print('---------------------------- First Pass Regression < 0.3--------------------------------------------')
[1] "---------------------------- First Pass Regression < 0.3--------------------------------------------"
rho_ereg_low = as.numeric(extract(fit_ereg_low, "rho")[[1]])
mean = mean(rho_ereg_low)
crI = quantile(rho_ereg_low, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_ereg_low), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: 0.4739
HPD: [0.4393, 0.5071]
crI: [0.4395, 0.5073]
print('---------------------------- First Pass Regression >= 0.3--------------------------------------------')
[1] "---------------------------- First Pass Regression >= 0.3--------------------------------------------"
rho_ereg_high = as.numeric(extract(fit_ereg_high, "rho")[[1]])
mean = mean(rho_ereg_high)
crI = quantile(rho_ereg_high, c(.025, .975))
hpd99 = HPDinterval(as.mcmc(rho_ereg_high), prob=0.95)
cat("Mean: ", mean, "\nHPD: [", hpd99[,"lower"], ", ", hpd99[,"upper"], "]", sep="", "\ncrI: [", crI[1], ", ", crI[2], "]\n")
Mean: 0.6711
HPD: [0.607, 0.7342]
crI: [0.6033, 0.7315]
print('---------------------------- First Pass Regression all data --------------------------------------------')
[1] "---------------------------- First Pass Regression all data --------------------------------------------"
eallreg_rand <- extract(fit_ereg_all, "x_rand")[[1]]
# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 1), ylim=c(0, 1), type="n",
     xlab = "Eye tracking value", ylab = "MoTR value", main = "FPReg") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color 
points(eallreg_rand[,1], eallreg_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(ereg_temp, pch=16, col="red")

# add dataEllipse with color 
dataEllipse(eallreg_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(eallreg_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")


print('---------------------------- First Pass Regression < 0.3 --------------------------------------------')
[1] "---------------------------- First Pass Regression < 0.3 --------------------------------------------"
elowreg_rand <- extract(fit_ereg_low, "x_rand")[[1]]
# print(elowreg_rand)
# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 1), ylim=c(0, 1), type="n",
     xlab = "Eye tracking value", ylab = "MoTR value", main = "FPReg") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color 
points(elowreg_rand[,1], elowreg_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(ereg_temp_low, pch=16, col="red")

# add dataEllipse with color 
dataEllipse(elowreg_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(elowreg_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")


print('---------------------------- First Pass Regression >= 0.3 --------------------------------------------')
[1] "---------------------------- First Pass Regression >= 0.3 --------------------------------------------"
ehighreg_rand_samples <- extract(fit_ereg_high, "x_rand")[[1]]
# print(mhighreg_rand_samples)
selected_indices <- sample(1:nrow(ehighreg_rand_samples), 900)
ehighreg_rand <- ehighreg_rand_samples[selected_indices, ]
# mhighreg_rand <- extract(fit_mreg_high, "x_rand")[[1]]
# create a blank plot first with appropriate limits
plot(1, 1, xlim=c(0, 1), ylim=c(0, 1), type="n",
     xlab = "Eye tracking value", ylab = "MoTR value", main = "FPReg") # 'type = "n"' makes sure the plot is blank

# add points for x_rand with color 
points(ehighreg_rand[,1], ehighreg_rand[,2], col = "black", pch = 16)
# add points for gd_temp with color red
points(ereg_temp_high, pch=16, col="red")

# add dataEllipse with color 
dataEllipse(ehighreg_rand, levels = c(0.5, 0.75), fill=T, plot.points = F, col="orange")
dataEllipse(ehighreg_rand, levels = c(0.95, 0.99), fill=T, plot.points = F, col="blue")

LS0tCnRpdGxlOiAiRXhwbG9yYXRvcnkgQW5hbHlzaXMgZm9yIE1vVFIgUmVhZGluZyBEYXRhIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7cn0Kc2hoaCA8LSBzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMgIyBJdCdzIGEgbGlicmFyeSwgc28gc2hoaCEKCnNoaGgobGlicmFyeSggbWdjdiApKQpzaGhoKGxpYnJhcnkoZHBseXIpKQpzaGhoKGxpYnJhcnkoZ2dwbG90MikpCnNoaGgobGlicmFyeShsbWU0KSkKc2hoaChsaWJyYXJ5KHRpZHltdikpCnNoaGgobGlicmFyeShnYW1sc3MpKQpzaGhoKGxpYnJhcnkoZ3N1YmZuKSkKc2hoaChsaWJyYXJ5KGxtZXJUZXN0KSkKc2hoaChsaWJyYXJ5KHRpZHl2ZXJzZSkpCnNoaGgobGlicmFyeShib290KSkKc2hoaChsaWJyYXJ5KHJzYW1wbGUpKQpzaGhoKGxpYnJhcnkocGxvdHJpeCkpCnNoaGgobGlicmFyeShnZ3JlcGVsKSkKc2hoaChsaWJyYXJ5KG1nY3YpKQoKc2hoaChsaWJyYXJ5KGJybXMpKQpzaGhoKGxpYnJhcnkoYmF5ZXNwbG90KSkKc2hoaChsaWJyYXJ5KHBhdGNod29yaykpCnNoaGgobGlicmFyeShNQVNTKSkKc2hoaChsaWJyYXJ5KHRpZHlyKSkKc2hoaChsaWJyYXJ5KGV4dHJhRGlzdHIpKQpzaGhoKGxpYnJhcnkocHVycnIpKQojIEZvciBleGVyY2lzZXMgd2l0aCBTdGFuIGNvZGUKc2hoaChsaWJyYXJ5KHJzdGFuKSkKb3B0aW9ucyhtYy5jb3JlcyA9IHBhcmFsbGVsOjpkZXRlY3RDb3JlcygpKQpyc3Rhbl9vcHRpb25zKGF1dG9fd3JpdGUgPSBGQUxTRSkKCmxpYnJhcnkoY2FyKQpsaWJyYXJ5KGNvZGEpCnNoaGgobGlicmFyeShncmlkRXh0cmEpKQoKdGhlbWVfc2V0KHRoZW1lX2J3KCkpCm9wdGlvbnMoZGlnaXRzPTQpCm9wdGlvbnMoc2NpcGVuPTk5OSkKc2V0LnNlZWQoNDQ0KQpwaXBlX21lc3NhZ2UgPSBmdW5jdGlvbiguZGF0YSwgc3RhdHVzKSB7bWVzc2FnZShzdGF0dXMpOyAuZGF0YX0KCmBgYAoKCiMgUmVhZCBpbiBNb1RSIERhdGEKCmBgYHtyfQoKcmF0ZSA9IDE2MAoKZmlsZV9wcmVmaXggPSAiLi4vcmVhZGluZ19tZWFzdXJlcy9wcm92by9wcm92b19mMTYwLyIKZm5hbWVzID0gbGlzdC5maWxlcyhwYXRoPWZpbGVfcHJlZml4KQoKZGYgPSBkYXRhLmZyYW1lKCkKZm9yIChmIGluIGZuYW1lcykgewogIHRlbXAgPSByZWFkLmNzdihwYXN0ZTAoZmlsZV9wcmVmaXgsICIvIiwgZikpICU+JQogICAgbXV0YXRlKHN1YmogPSBzdHJfcmVtb3ZlKGYsICJfcmVhZGluZ19tZWFzdXJlcy5jc3YiKSkKICBkZiA9IHJiaW5kKGRmLCB0ZW1wKQp9CgojIEZpbHRlciBvdXQgcmVhZGVycyB3aG8gZG9uJ3QgYW5zd2VyIHRoZSBjb21wcmVoZW5zaW9uIHF1ZXN0aW9ucyBjb3JyZWN0bHkKZmlsdGVyX2RmID0gZGYgJT4lCiAgZ3JvdXBfYnkocGFyYV9uciwgc3ViaikgJT4lIHN1bW1hcmlzZShjb3JyZWN0ID0gaWZfZWxzZSh1bmlxdWUoY29ycmVjdG5lc3MpID09IDEsIDEsIDApKSAlPiUgdW5ncm91cCgpICU+JQogIGRyb3BfbmEoKSAlPiUKICBncm91cF9ieShzdWJqKSAlPiUgc3VtbWFyaXNlKHBfY29ycmVjdCA9IG1lYW4oY29ycmVjdCkpICU+JSB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHBfY29ycmVjdCA9IHJvdW5kKHBfY29ycmVjdCwgZGlnaXRzID0gMikpCgpmaWx0ZXJfZGYgPSBmaWx0ZXJfZGYgJT4lIGZpbHRlcihwX2NvcnJlY3QgPCAwLjgpCmZpbHRlcl9saXN0ID0gZmlsdGVyX2RmJHN1YmoKIyMgcmVhZGVyXzM6MC43MCwgcmVhZGVyXzYwOjAuNzksIHJlYWRlcl83NjowLjcyICwgcmVhZGVyXzI1NjowLjcxICwgcmVhZGVyXzI2MjowLjU3IAoKcmF3X2RmID0gZGYgJT4lCiAgZmlsdGVyKCEgc3ViaiAlaW4lIGMoZmlsdGVyX2xpc3QpKSAlPiUKICBtdXRhdGUod29yZCA9IHN0cl90cmltKHdvcmQpKSAlPiUKICBtdXRhdGUoc3ViaiA9IHN0cl9yZW1vdmUoc3ViaiwgInJlYWRlcl8iKSkgJT4lCiAgbXV0YXRlKHN1YmogPSBhcy5jaGFyYWN0ZXIoc3ViaikpICU+JQogICMgZmlsdGVyKCEgc3ViaiAlaW4lIGMoIjMiLCAiNjAiLCAiNzYiLCAiMjU2IiwgIjI2MiIpKSAlPiUgIyBFeHBsYW5hdGlvbiBmb3IgdGhpcyBmaWx0ZXJpbmcKICBtdXRhdGUoRlBSZWcgPSBpZl9lbHNlKHRvdGFsX2R1cmF0aW9uID09IDAsIC0xLCBGUFJlZykpICU+JSAjSWYgdGhlIHdvcmQgaXMgc2tpcHBlZCB3ZSBjYW4ndCBzYXkgdGhhdCBpdCB3YXNuJ3QgcmVncmVzc2VkIG9uIHRoZSBmaXJzdCBwYXNzLiBTZXQgdG8gYSAiTkEiCiAgZHBseXI6OnNlbGVjdChleHByX2lkLCBjb25kX2lkLCBwYXJhX25yLCB3b3JkLCB3b3JkX25yLCBmaXJzdF9kdXJhdGlvbiwgdG90YWxfZHVyYXRpb24sIGdhemVfZHVyYXRpb24sIGdvX3Bhc3RfdGltZSwgRlBSZWcsIHN1YmopCgpsZW5ndGgodW5pcXVlKHJhd19kZiRzdWJqKSkKCmRmICU+JQogIGZpbHRlcighIHN1YmogJWluJSBjKGZpbHRlcl9saXN0KSkgJT4lCiAgZmlsdGVyKEZQUmVnID49IDApICU+JQogIGRwbHlyOjpzZWxlY3QoRlBSZWcpICU+JQogIGRyb3BfbmEoKSAlPiUKICBzdW1tYXJpc2UoIG0gPSBtZWFuKEZQUmVnKSkKCmRmICU+JQogIGZpbHRlcighIHN1YmogJWluJSBjKGZpbHRlcl9saXN0KSkgJT4lCiAgZHBseXI6OnNlbGVjdChGUEZpeCkgJT4lCiAgZHJvcF9uYSgpICU+JQogIHN1bW1hcmlzZSggbSA9IG1lYW4oRlBGaXgpKQoKCmBgYAoKCmBgYHtyfQojIEF2ZXJhZ2UgYWNyb3NzIHN1YmplY3RzCm1vdHJfYWdnX2RmID0gcmF3X2RmICU+JQogIGdhdGhlcihtZXRyaWMsIHZhbHVlLCA2OjEwKSAlPiUKICAgIGZpbHRlcih2YWx1ZSA+PSAwKSAlPiUgI1JlbW92ZXMgdGhlICJOQSIgdmFsdWVzIGZvciBGUFJlZwogIAogICAgIyA9PT09IFJlbW92ZSBza2lwcGVkIHdvcmRzCiAgICAjIG11dGF0ZSh6ZXJvID0gaWZfZWxzZShtZXRyaWMgIT0gIkZQUmVnIiAmIHZhbHVlID09IDAsVCwgRikpICU+JQogICAgIyBmaWx0ZXIoemVybyA9PSBGKSAlPiUKICAKICAgIGRyb3BfbmEoKSAlPiUKICAgIGdyb3VwX2J5KHBhcmFfbnIsIHdvcmRfbnIsIHdvcmQsIG1ldHJpYykgJT4lIAogICAgICBtdXRhdGUob3V0bGllciA9IGlmX2Vsc2UobWV0cmljICE9ICJGUFJlZyIgJiB2YWx1ZSA+IChtZWFuKHZhbHVlKSArIDMgKiBzZCh2YWx1ZSkpLCBULCBGKSkgJT4lIGZpbHRlcihvdXRsaWVyID09IEYpICU+JQogICAgICBzdW1tYXJpc2UodmFsdWUgPSBtZWFuKHZhbHVlKSwgbnN1YmogPSBsZW5ndGgodW5pcXVlKHN1YmopKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGFycmFuZ2UocGFyYV9uciwgd29yZF9ucikgJT4lCiAgcmVuYW1lKHRleHRfaWQgPSBwYXJhX25yLCB3b3JkX3RleHRfaWR4ID0gd29yZF9uciwgbW90cl92YWx1ZSA9IHZhbHVlKQoKIyBWaWV3KG1vdHJfYWdnX2RmKQojIHdyaXRlLmNzdihtb3RyX2FnZ19kZiwgZmlsZSA9ICIvVXNlcnMvY3VpL0Rlc2t0b3AvTW9UUi9waXBlbGluZS9hbmNpbGxhcnlfZGF0YS9tb3RyX2FnZ19kZi5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkKCmBgYAoKCgoKIyBDb21wYXJpc29uIHRvIFByb3ZvCgoKYGBge3J9CiMgUmVhZCBpbiBQcm92byBzdXJwcmlzYWwsIGZyZXF1ZW5jeSBhbmQgbGVuZ3RoIGRhdGEKcHJvdm9fbW9kZWxpbmdfZGYgPSByZWFkLmNzdigiLi4vYW5jaWxsYXJ5X2RhdGEvcHJvdm9fZGYuY3N2IikgJT4lCiAgZHBseXI6OnNlbGVjdCh0ZXh0X2lkLCBzZW50X2lkLCB0cmlnZ2VyX2lkeCwgd29yZCwgZnJlcSwgc3VycCwgbGVuKSAlPiUKICByZW5hbWUod29yZF9pZHggPSB0cmlnZ2VyX2lkeCkKCnByb3ZvX21vZGVsaW5nX2RmCiMgVmlldyhwcm92b19tb2RlbGluZ19kZikKCmBgYAoKYGBge3J9CiMgUmVhZCBpbiBQcm92byBleWV0cmFja2luZyBkYXRhCgpwcm92b19yYXdfZGYgPSByZWFkLmNzdigiLi4vYW5jaWxsYXJ5X2RhdGEvcHJvdm9fZXlldHJhY2tpbmcuY3N2IikKCmBgYAoKYGBge3J9CgojIHVuaXF1ZShwcm92b19yYXdfZGYkUGFydGljaXBhbnRfSUQpCiMgbGVuZ3RoKHVuaXF1ZShwcm92b19yYXdfZGYkUGFydGljaXBhbnRfSUQpKQoKcHJvdm9fZXlldHJhY2tpbmdfZGYgPSBwcm92b19yYXdfZGYgJT4lCiAgZHBseXI6OnNlbGVjdChQYXJ0aWNpcGFudF9JRCwgVGV4dF9JRCwgU2VudGVuY2VfTnVtYmVyLCBXb3JkX0luX1NlbnRlbmNlX051bWJlciwgV29yZCwgV29yZF9OdW1iZXIsIElBX0ZJUlNUX0ZJWF9QUk9HUkVTU0lWRSwgSUFfRklSU1RfUlVOX0RXRUxMX1RJTUUsIElBX0RXRUxMX1RJTUUsIElBX1JFR1JFU1NJT05fUEFUSF9EVVJBVElPTiwgSUFfUkVHUkVTU0lPTl9PVVQsIElBX1NLSVApICU+JQogIHJlbmFtZSggI2ZpcnN0X2R1cmF0aW9uID0gSUFfRklSU1RfRklYQVRJT05fRFVSQVRJT04sICAgCiAgICAgICAgICBnYXplX2R1cmF0aW9uID0gSUFfRklSU1RfUlVOX0RXRUxMX1RJTUUsCiAgICAgICAgICB0b3RhbF9kdXJhdGlvbiA9IElBX0RXRUxMX1RJTUUsCiAgICAgICAgICBnb19wYXN0X3RpbWUgPSBJQV9SRUdSRVNTSU9OX1BBVEhfRFVSQVRJT04sCiAgICAgICAgICBzdWJqID0gUGFydGljaXBhbnRfSUQsCiAgICAgICAgICB0ZXh0X2lkID0gVGV4dF9JRCwKICAgICAgICAgIHNlbnRfaWQgPSBTZW50ZW5jZV9OdW1iZXIsCiAgICAgICAgICB3b3JkX2lkeCA9IFdvcmRfSW5fU2VudGVuY2VfTnVtYmVyLAogICAgICAgICAgd29yZF90ZXh0X2lkeCA9IFdvcmRfTnVtYmVyLCAgICMgSUFfSUQ/CiAgICAgICAgICB3b3JkID0gV29yZCwgICAgICAjIFdvcmQ/CiAgICAgICAgICBGUFJlZyA9IElBX1JFR1JFU1NJT05fT1VULAogICAgICAgICAgc2tpcCA9IElBX1NLSVAsCiAgICAgICAgICBmZl9wcm9ncmVzc2l2ZSA9IElBX0ZJUlNUX0ZJWF9QUk9HUkVTU0lWRSkgJT4lCiAgbXV0YXRlKGZpcnN0X2R1cmF0aW9uID0gZ2F6ZV9kdXJhdGlvbikgJT4lCiAgbXV0YXRlKGdhemVfZHVyYXRpb24gPSBpZl9lbHNlKGZmX3Byb2dyZXNzaXZlID09IDAsIDAsIGFzLmRvdWJsZShnYXplX2R1cmF0aW9uKSksCiAgICAgICAgIGdvX3Bhc3RfdGltZSA9IGlmX2Vsc2UoZmZfcHJvZ3Jlc3NpdmUgPT0gMCwgMCwgYXMuZG91YmxlKGdvX3Bhc3RfdGltZSkpKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1mZl9wcm9ncmVzc2l2ZSkgJT4lCiAgCiAgbXV0YXRlKAogICAgZ2F6ZV9kdXJhdGlvbiA9IGlmX2Vsc2UodG90YWxfZHVyYXRpb24gPT0gMCwgMCwgYXMuZG91YmxlKGdhemVfZHVyYXRpb24pKSwKICAgICAgZ29fcGFzdF90aW1lID0gaWZfZWxzZSh0b3RhbF9kdXJhdGlvbiA9PSAwLCAwLCBhcy5kb3VibGUoZ29fcGFzdF90aW1lKSksCiAgICAgIEZQUmVnID0gaWZfZWxzZSh0b3RhbF9kdXJhdGlvbiA9PSAwLCAtMSwgYXMuZG91YmxlKEZQUmVnKSksCiAgICAgIGZpcnN0X2R1cmF0aW9uID0gIGlmX2Vsc2UodG90YWxfZHVyYXRpb24gPT0gMCwgMCwgYXMuZG91YmxlKGZpcnN0X2R1cmF0aW9uKSksCiAgKSAlPiUKICAKICAjIGRyb3BfbmEoKSAlPiUgICAgICMgd2lsbCBkcm9wIHRoZSB3aG9sZSByb3cgd2l0aCBhbGwgdGhlIG1ldHJpY3MKICBnYXRoZXIobWV0cmljLCB2YWx1ZSwgNzoxMikgJT4lCiAgZmlsdGVyKHZhbHVlID49IDApICU+JSAgICAgICAgICAjIGZpbHRlciBza2lwcGVkIHdvcmQgaW4gZXllIHRyYWNraW5nIGRhdGEgZm9yIEZQUmVnCiAgIyA9PT09IFJlbW92ZSBza2lwcGVkIHdvcmRzCiAgIyBtdXRhdGUoemVybyA9IGlmX2Vsc2UobWV0cmljICE9ICJGUFJlZyIgJiB2YWx1ZSA9PSAwLFQsIEYpKSAlPiUKICAjIGZpbHRlcih6ZXJvID09IEYpICU+JQogIAogICMgbXV0YXRlKHZhbHVlID0gaWZfZWxzZShpcy5uYSh2YWx1ZSksIGFzLmludGVnZXIoMCksIGFzLmludGVnZXIodmFsdWUpKSkgJT4lCiAgIyBtdXRhdGUodmFsdWUgPSBpZl9lbHNlKG1ldHJpYyAhPSAiRlBSZWciICYgaXMubmEodmFsdWUpLCBhcy5pbnRlZ2VyKDApLCBhcy5pbnRlZ2VyKHZhbHVlKSkpICU+JQogIGRyb3BfbmEoKSAlPiUKICBtdXRhdGUod29yZCA9IHN0cl90cmltKHdvcmQpKSAlPiUKICBtdXRhdGUoc3ViaiA9IHN0cl9yZW1vdmUoc3ViaiwgIlN1YiIpKSAlPiUKICBtdXRhdGUoc3ViaiA9IGFzLmludGVnZXIoc3ViaikpICU+JQogICAgZ3JvdXBfYnkodGV4dF9pZCwgd29yZF90ZXh0X2lkeCwgc2VudF9pZCwgd29yZF9pZHgsIHdvcmQsIG1ldHJpYykgJT4lCiAgICBtdXRhdGUob3V0bGllciA9IGlmX2Vsc2UobWV0cmljICE9ICJGUFJlZyIgJiBtZXRyaWMgIT0gInNraXAiICYgdmFsdWUgPiAobWVhbih2YWx1ZSkgKyAzICogc2QodmFsdWUpICksIFQsIEYpKSAlPiUKICAgIGZpbHRlcihvdXRsaWVyID09IEYpICU+JQogIHVuZ3JvdXAoKSAjJT4lCgojIEFnZ3JlZ2F0ZSBjcm9zcy1wYXJ0aWNpcGFudCBkYXRhIGZvciBhbGwgc3ViamVjdHMKcHJvdm9fZXlldHJhY2tpbmdfYWdnX2RmID0gcHJvdm9fZXlldHJhY2tpbmdfZGYgJT4lCiAgZ3JvdXBfYnkodGV4dF9pZCwgd29yZF90ZXh0X2lkeCwgc2VudF9pZCwgd29yZF9pZHgsIHdvcmQsIG1ldHJpYykgJT4lCiAgICBzdW1tYXJpc2UodmFsdWUgPSBtZWFuKHZhbHVlKSwKICAgICAgICAgICAgICBuc3ViaiA9IGxlbmd0aCh1bmlxdWUoc3ViaikpKSAlPiUKICAgIHVuZ3JvdXAoKQoKIyBWaWV3KHByb3ZvX2V5ZXRyYWNraW5nX2RmKQoKIyBWaWV3KHByb3ZvX2V5ZXRyYWNraW5nX2FnZ19kZikKIyB3cml0ZS5jc3YocHJvdm9fZXlldHJhY2tpbmdfYWdnX2RmLCBmaWxlID0gIi9Vc2Vycy9jdWkvRGVza3RvcC9Nb1RSL3BpcGVsaW5lL2FuY2lsbGFyeV9kYXRhL3Byb3ZvX2V5ZXRyYWNraW5nX2FnZ19kZi5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkKCnByb3ZvX3Jhd19kZiAlPiUKICBkcGx5cjo6c2VsZWN0KElBX1JFR1JFU1NJT05fT1VUKSAlPiUKICBkcm9wX25hKCkgJT4lCiAgc3VtbWFyaXNlKCBtID0gbWVhbihJQV9SRUdSRVNTSU9OX09VVCkpCgpwcm92b19yYXdfZGYgJT4lCiAgZHBseXI6OnNlbGVjdChJQV9TS0lQKSAlPiUKICBkcm9wX25hKCkgJT4lCiAgc3VtbWFyaXNlKCBtID0gbWVhbihJQV9TS0lQKSkKCgpgYGAKCmBgYHtyfQoKIyBTcGxpdCB0aGUgZXlldHJhY2tpbmcgZGF0YSBpbiB0d28gYnkgc3ViamVjdHMgdG8gc2VlIGhvdyB3ZWxsIGl0IGNvcnJlbGF0ZXMgd2l0aCBpdHNlbGYKcHJvdm9fZXlldHJhY2tpbmdfc3ViajFfZGZfdGVtcCA9IHByb3ZvX2V5ZXRyYWNraW5nX2RmICU+JQogIGZpbHRlcihzdWJqIDw9IDQyKSAlPiUKICBtdXRhdGUod29yZF90ZXh0X2lkeCA9IGFzLmludGVnZXIod29yZF90ZXh0X2lkeCAtIDEpKSAlPiUKICBncm91cF9ieSh0ZXh0X2lkLCB3b3JkX3RleHRfaWR4LCBzZW50X2lkLCB3b3JkX2lkeCwgd29yZCwgbWV0cmljKSAlPiUKICAgIHN1bW1hcmlzZSh2YWx1ZSA9IG1lYW4odmFsdWUpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgcmVuYW1lKHZhbHVlXzEgPSB2YWx1ZSkgIyU+JQogICMgZHBseXI6OnNlbGVjdCgtc2VudF9pZCwgLXdvcmRfaWR4KQoKIyBWaWV3KHByb3ZvX2V5ZXRyYWNraW5nX3N1YmoxX2RmX3RlbXApCgpwcm92b19leWV0cmFja2luZ19zdWJqMV9kZiA9IG1lcmdlKHByb3ZvX2V5ZXRyYWNraW5nX3N1YmoxX2RmX3RlbXAsIG1vdHJfYWdnX2RmLCBieT1jKCJ0ZXh0X2lkIiwgIndvcmRfdGV4dF9pZHgiLCAibWV0cmljIikpICU+JQogIGFycmFuZ2UodGV4dF9pZCwgc2VudF9pZCwgd29yZF9pZHgpICU+JQogIGZpbHRlcighKHRleHRfaWQgPT0gMTMgJiB3b3JkX3RleHRfaWR4ID49IDIwICYgd29yZF90ZXh0X2lkeCA8PSA1MikpICU+JQogIGZpbHRlcighKHRleHRfaWQgPT0gMyAmIHdvcmRfdGV4dF9pZHggPj0gNDYgJiB3b3JkX3RleHRfaWR4IDw9IDU3KSkgJT4lCiAgcmVuYW1lKHdvcmQgPSB3b3JkLnkpICU+JQogIGRwbHlyOjpzZWxlY3QodGV4dF9pZCwgd29yZF90ZXh0X2lkeCwgbWV0cmljLCB3b3JkLCB2YWx1ZV8xKQoKIyBWaWV3KHByb3ZvX2V5ZXRyYWNraW5nX3N1YmoxX2RmKQoKcHJvdm9fZXlldHJhY2tpbmdfc3ViajJfZGYgPSBwcm92b19leWV0cmFja2luZ19kZiAlPiUKICBmaWx0ZXIoc3ViaiA+IDQyKSAlPiUKICBtdXRhdGUod29yZF90ZXh0X2lkeCA9IGFzLmludGVnZXIod29yZF90ZXh0X2lkeCAtIDEpKSAlPiUKICBncm91cF9ieSh0ZXh0X2lkLCB3b3JkX3RleHRfaWR4LCBzZW50X2lkLCB3b3JkX2lkeCwgd29yZCwgbWV0cmljKSAlPiUKICAgIHN1bW1hcmlzZSh2YWx1ZSA9IG1lYW4odmFsdWUpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgICByZW5hbWUodmFsdWVfMiA9IHZhbHVlKSU+JQogIGRwbHlyOjpzZWxlY3QoLXNlbnRfaWQsIC13b3JkX2lkeCkKCiMgVmlldyhwcm92b19leWV0cmFja2luZ19zdWJqMl9kZikKICAKcHJvdm9fZXlldHJfZ3JvdXBlZF9kZiA9IG1lcmdlKHByb3ZvX2V5ZXRyYWNraW5nX3N1YmoyX2RmLCBwcm92b19leWV0cmFja2luZ19zdWJqMV9kZiwgYnk9YygidGV4dF9pZCIsICJ3b3JkX3RleHRfaWR4IiwgIm1ldHJpYyIpKSAlPiUKICAjIGZpbHRlcih3b3JkLnggPT0gd29yZC55KSAlPiUKICBkcGx5cjo6c2VsZWN0KC13b3JkLnkpICU+JQogIGdyb3VwX2J5KG1ldHJpYykgJT4lCiAgICBtdXRhdGUobW90cl9vdXRsaWVyID0gaWZfZWxzZShtZXRyaWMgIT0gIkZQUmVnIiAmIG1ldHJpYyAhPSAic2tpcCIgJiB2YWx1ZV8xID4gKG1lYW4odmFsdWVfMSkgKyAzICogc2QodmFsdWVfMSkgKSwgVCwgRikpICU+JQogICAgZmlsdGVyKG1vdHJfb3V0bGllciA9PSBGKSAlPiUKICAgIG11dGF0ZShleWV0cl9vdXRsaWVyID0gaWZfZWxzZShtZXRyaWMgIT0gIkZQUmVnIiAmIG1ldHJpYyAhPSAic2tpcCIgJiB2YWx1ZV8yID4gKG1lYW4odmFsdWVfMikgKyAzICogc2QodmFsdWVfMikgKSwgVCwgRikpICU+JQogICAgZmlsdGVyKGV5ZXRyX291dGxpZXIgPT0gRikgJT4lCiAgdW5ncm91cCgpICU+JQogIGdhdGhlcihtZWFzdXJlLCB2YWx1ZSwgYygidmFsdWVfMSIsICJ2YWx1ZV8yIikpICU+JQogIGRwbHlyOjpzZWxlY3QoLW1vdHJfb3V0bGllciwgLWV5ZXRyX291dGxpZXIpCgojIFZpZXcocHJvdm9fZXlldHJfZ3JvdXBlZF9kZikKCmBgYAoKCmBgYHtyfQpwcm92b19kZiA9IG1lcmdlKHByb3ZvX2V5ZXRyYWNraW5nX2FnZ19kZiwgcHJvdm9fbW9kZWxpbmdfZGYsIGJ5PWMoInRleHRfaWQiLCAic2VudF9pZCIsICJ3b3JkX2lkeCIpKSAlPiUKICBtdXRhdGUod29yZF90ZXh0X2lkeCA9IGFzLmludGVnZXIod29yZF90ZXh0X2lkeCAtIDEpKSAlPiUKICBhcnJhbmdlKHRleHRfaWQsIHNlbnRfaWQsIHdvcmRfaWR4KSAlPiUKICByZW5hbWUoZXlldHJfdmFsdWUgPSB2YWx1ZSkgCgpwcm92b19kZiA9IG1lcmdlKHByb3ZvX2RmLCBtb3RyX2FnZ19kZiwgYnk9YygidGV4dF9pZCIsICJ3b3JkX3RleHRfaWR4IiwgIm1ldHJpYyIpKSAlPiUKYXJyYW5nZSh0ZXh0X2lkLCBzZW50X2lkLCB3b3JkX2lkeCkgJT4lCiAgIyBhbG1vc3QgYWxsIHRoZSB3b3JkLnggIT0gd29yZC55IGlzIGJlY2F1c2Ugb2Ygbm9ybWFsaXphdGlvbiBwcm9ibGVtLCBzbyB3ZSBjYW4ga2VlcCB0aGVtLCBpbnN0ZWFkLCBkZWxldGluZyBzb21lIHNwZWNpYWwgY2FzZXMKZmlsdGVyKCEodGV4dF9pZCA9PSAxMyAmIHdvcmRfdGV4dF9pZHggPj0gMjAgJiB3b3JkX3RleHRfaWR4IDw9IDUyKSkgJT4lCiAgZmlsdGVyKCEodGV4dF9pZCA9PSAzICYgd29yZF90ZXh0X2lkeCA+PSA0NiAmIHdvcmRfdGV4dF9pZHggPD0gNTcpKSAlPiUKIyBmaWx0ZXIod29yZC54ID09IHdvcmQpICMlPiUKZHBseXI6OnNlbGVjdCgtd29yZC54LCAtd29yZC55KSAlPiUKZ3JvdXBfYnkobWV0cmljKSAlPiUKICBtdXRhdGUobW90cl9vdXRsaWVyID0gaWZfZWxzZShtZXRyaWMgIT0gIkZQUmVnIiAmIG1vdHJfdmFsdWUgPiAobWVhbihtb3RyX3ZhbHVlKSArIDMgKiBzZChtb3RyX3ZhbHVlKSApLCBULCBGKSkgJT4lCiAgZmlsdGVyKG1vdHJfb3V0bGllciA9PSBGKSAlPiUKICBtdXRhdGUoZXlldHJfb3V0bGllciA9IGlmX2Vsc2UobWV0cmljICE9ICJGUFJlZyIgJiBleWV0cl92YWx1ZSA+IChtZWFuKGV5ZXRyX3ZhbHVlKSArIDMgKiBzZChleWV0cl92YWx1ZSkgKSwgVCwgRikpICU+JQogIGZpbHRlcihleWV0cl9vdXRsaWVyID09IEYpICU+JQp1bmdyb3VwKCkgJT4lCmdhdGhlcihtZWFzdXJlLCB2YWx1ZSwgYygiZXlldHJfdmFsdWUiLCAibW90cl92YWx1ZSIpKSAlPiUKZHBseXI6OnNlbGVjdCgtbW90cl9vdXRsaWVyLCAtZXlldHJfb3V0bGllcikKICAKIyBWaWV3KHByb3ZvX2RmKQojIHByb3ZvX2RmCmBgYAoKCiMgQmF5ZXNpYW4gLS0gdXNlIFN0YW4gLS0gbW90ciAmIGV5ZXRyIGNvcnJlbGF0aW9uCmBgYHtyfQpwcmludCgiR2F6ZSBEdXJhdGlvbiIpCmdkX2RmID0gcHJvdm9fZGYgJT4lIGZpbHRlcihtZXRyaWMgPT0gImdhemVfZHVyYXRpb24iKSAlPiUgCiAgc3ByZWFkKG1lYXN1cmUsIHZhbHVlKSAlPiUKICAjIHNtb290aGluZywgaWYgaW5jbHVkZXMgMHMKICBtdXRhdGUoZXlldHJfdmFsdWUgPSAgcG1heChleWV0cl92YWx1ZSwgMSksCiAgICAgICAgIG1vdHJfdmFsdWUgPSBwbWF4KG1vdHJfdmFsdWUsIDEpCiAgKSAlPiUKICBtdXRhdGUoZXlldHJfdmFsdWVfbG9nID0gbG9nKGV5ZXRyX3ZhbHVlKSwKICAgICAgICAgbW90cl92YWx1ZV9sb2cgPSBsb2cobW90cl92YWx1ZSkpCnByaW50KGNvci50ZXN0KGdkX2RmJGV5ZXRyX3ZhbHVlLCBnZF9kZiRtb3RyX3ZhbHVlKSRlc3RpbWF0ZSkKcHJpbnQoY29yLnRlc3QoZ2RfZGYkZXlldHJfdmFsdWVfbG9nLCBnZF9kZiRtb3RyX3ZhbHVlX2xvZykkZXN0aW1hdGUpCiMgVmlldyhnZF9kZikKYGBgCgoKYGBge3J9CmdkX2RmICU+JSAKICBnYXRoZXIobWVhc3VyZSwgdmFsdWUsIDEyOjE1KSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB2YWx1ZSkpICsKICBnZW9tX2RlbnNpdHkoKSArCiAgZmFjZXRfd3JhcCh+bWVhc3VyZSwgc2NhbGVzID0gImZyZWUiKSArCiAgdGhlbWVfYncoKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQxIikKICAKYGBgCgoKCmBgYHtyfQojIGNlbnRlciBkYXRhIGFyb3VuZCAwLgoKZ2RfdGVtcCA8LSBnZF9kZltjKCJleWV0cl92YWx1ZSIsICJtb3RyX3ZhbHVlIildICU+JQogICAjIG11dGF0ZShleWV0cl92YWx1ZSA9IGV5ZXRyX3ZhbHVlIC0gbWVhbihleWV0cl92YWx1ZSksCiAgICMgICAgICBtb3RyX3ZhbHVlID0gbW90cl92YWx1ZSAtIG1lYW4obW90cl92YWx1ZSkpICU+JQogIGRhdGEubWF0cml4KCkKCmdkX3RlbXBfbG9nIDwtIGdkX2RmW2MoImV5ZXRyX3ZhbHVlX2xvZyIsICJtb3RyX3ZhbHVlX2xvZyIpXSAlPiUKIG11dGF0ZShleWV0cl92YWx1ZV9sb2cgPSBleWV0cl92YWx1ZV9sb2cgLSBtZWFuKGV5ZXRyX3ZhbHVlX2xvZyksIAogICAgICAgIG1vdHJfdmFsdWVfbG9nID0gbW90cl92YWx1ZV9sb2cgLSBtZWFuKG1vdHJfdmFsdWVfbG9nKSkgJT4lCiAgZGF0YS5tYXRyaXgoKQoKIyBTZXQgdXAgdGhlIHBsb3R0aW5nIGFyZWEgd2l0aCB0d28gc2lkZS1ieS1zaWRlIHBsb3RzCnBhcihtZnJvdyA9IGMoMSwgMikpCiMgUGxvdCB0aGUgZmlyc3QgZGF0YSBtYXRyaXggZ2RfdGVtcApwbG90KGdkX3RlbXAsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsCiAgICAgbWFpbiA9ICJOb3QgTG9nLVRyYW5zZm9ybWVkIikKIyBQbG90IHRoZSBzZWNvbmQgZGF0YSBtYXRyaXggZ2RfdGVtcF9sb2cKcGxvdChnZF90ZW1wX2xvZywgcGNoID0gMTYsIGNvbCA9ICJyZWQiLAogICAgIG1haW4gPSAiQ2VudGVyZWQgTG9nLVRyYW5zZm9ybWVkIikKCmBgYAoKCgpgYGB7ciwgZXZhbD1GQUxTRX0KZ2RfZGF0YSA9IGxpc3QoeD1nZF90ZW1wLCBOPW5yb3coZ2RfdGVtcCkpCgpmaXRfZ2QgPSBzdGFuKAogIGZpbGU9InN0YW5fbW9kZWxzL2JpdmFyaWF0ZV9jb3JyZWxhdGlvbi5zdGFuIiwgCiAgZGF0YT1nZF9kYXRhLCAKICBpdGVyPTQwMDAsIAogIGNoYWlucz00LCAKICBjb3Jlcz04LAogIHNlZWQ9NDQ0LAogICMgY29udHJvbD1saXN0KGFkYXB0X2RlbHRhPTAuOTkpLCAKICB2ZXJib3NlID0gRkFMU0UKICApCgojIFNhdmUgdGhlIG1vZGVsIApmaXRfZ2RAc3Rhbm1vZGVsQGRzbyA8LSBuZXcoImN4eGRzbyIpCnNhdmVSRFMoZml0X2dkLCBmaWxlID0gcGFzdGUwKCJtb3RyX2V5ZXRyX2dhemVfZHVyYXRpb25fY29yX2Ryb3Awcy5yZHMiKSkKCmBgYAoKYGBge3J9CnByaW50KCJHbyBQYXN0IFRpbWUiKQpncHRfZGYgPSBwcm92b19kZiAlPiUgZmlsdGVyKG1ldHJpYyA9PSAiZ29fcGFzdF90aW1lIikgJT4lIAogIHNwcmVhZChtZWFzdXJlLCB2YWx1ZSkgJT4lCiAgIyBzbW9vdGhpbmcsIGlmIGluY2x1ZGVzIDBzCiAgbXV0YXRlKGV5ZXRyX3ZhbHVlID0gIHBtYXgoZXlldHJfdmFsdWUsIDEpLAogICAgICAgICBtb3RyX3ZhbHVlID0gcG1heChtb3RyX3ZhbHVlLCAxKQogICkgJT4lCiAgbXV0YXRlKGV5ZXRyX3ZhbHVlX2xvZyA9IGxvZyhleWV0cl92YWx1ZSksCiAgICAgICAgIG1vdHJfdmFsdWVfbG9nID0gbG9nKG1vdHJfdmFsdWUpKQpwcmludChjb3IudGVzdChncHRfZGYkZXlldHJfdmFsdWUsIGdwdF9kZiRtb3RyX3ZhbHVlKSRlc3RpbWF0ZSkKcHJpbnQoY29yLnRlc3QoZ3B0X2RmJGV5ZXRyX3ZhbHVlX2xvZywgZ3B0X2RmJG1vdHJfdmFsdWVfbG9nKSRlc3RpbWF0ZSkKCmdwdF9kZiAlPiUgCiAgZ2F0aGVyKG1lYXN1cmUsIHZhbHVlLCAxMjoxNSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdmFsdWUpKSArCiAgZ2VvbV9kZW5zaXR5KCkgKwogIGZhY2V0X3dyYXAofm1lYXN1cmUsIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpCgpncHRfdGVtcCA8LSBncHRfZGZbYygiZXlldHJfdmFsdWUiLCAibW90cl92YWx1ZSIpXSAlPiUgZGF0YS5tYXRyaXgoKQoKZ3B0X3RlbXBfbG9nIDwtIGdwdF9kZltjKCJleWV0cl92YWx1ZV9sb2ciLCAibW90cl92YWx1ZV9sb2ciKV0gJT4lCiBtdXRhdGUoZXlldHJfdmFsdWVfbG9nID0gZXlldHJfdmFsdWVfbG9nIC0gbWVhbihleWV0cl92YWx1ZV9sb2cpLCAKICAgICAgICBtb3RyX3ZhbHVlX2xvZyA9IG1vdHJfdmFsdWVfbG9nIC0gbWVhbihtb3RyX3ZhbHVlX2xvZykpICU+JQogIGRhdGEubWF0cml4KCkKCiMgU2V0IHVwIHRoZSBwbG90dGluZyBhcmVhIHdpdGggdHdvIHNpZGUtYnktc2lkZSBwbG90cwpwYXIobWZyb3cgPSBjKDEsIDIpKQojIFBsb3QgdGhlIGZpcnN0IGRhdGEgbWF0cml4IGdwdF90ZW1wCnBsb3QoZ3B0X3RlbXAsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsCiAgICAgbWFpbiA9ICJOb3QgTG9nLVRyYW5zZm9ybWVkIikKIyBQbG90IHRoZSBzZWNvbmQgZGF0YSBtYXRyaXggZ3B0X3RlbXBfbG9nCnBsb3QoZ3B0X3RlbXBfbG9nLCBwY2ggPSAxNiwgY29sID0gInJlZCIsCiAgICAgbWFpbiA9ICJDZW50ZXJlZCBMb2ctVHJhbnNmb3JtZWQiKQpgYGAKCmBgYHtyLCBldmFsPUZBTFNFfQojIC0tLS0tLS1maXQgbW9kZWwgZ28gcGFzdCB0aW1lIC0tLS0tLS0tLS0KZ3B0X2RhdGEgPSBsaXN0KHg9Z3B0X3RlbXAsIE49bnJvdyhncHRfdGVtcCkpCmZpdF9ncHQgPSBzdGFuKAogIGZpbGU9InN0YW5fbW9kZWxzL2JpdmFyaWF0ZV9jb3JyZWxhdGlvbi5zdGFuIiwgCiAgZGF0YT1ncHRfZGF0YSwgCiAgaXRlcj00MDAwLCAKICBjaGFpbnM9NCwgCiAgY29yZXM9OCwKICBzZWVkPTQ0NCwKICAjIGNvbnRyb2w9bGlzdChhZGFwdF9kZWx0YT0wLjk5KSwgCiAgdmVyYm9zZSA9IEZBTFNFCiAgKQoKIyBTYXZlIHRoZSBtb2RlbCAKZml0X2dwdEBzdGFubW9kZWxAZHNvIDwtIG5ldygiY3h4ZHNvIikKc2F2ZVJEUyhmaXRfZ3B0LCBmaWxlID0gcGFzdGUwKCJtb3RyX2V5ZXRyX2dvX3Bhc3RfdGltZV9jb3JfZHJvcDBzLnJkcyIpKQpgYGAKCgpgYGB7cn0KcHJpbnQoIlRvdGFsIER1cmF0aW9uIikKdGRfZGYgPSBwcm92b19kZiAlPiUgZmlsdGVyKG1ldHJpYyA9PSAidG90YWxfZHVyYXRpb24iKSAlPiUgCiAgc3ByZWFkKG1lYXN1cmUsIHZhbHVlKSAlPiUKICAjIHNtb290aGluZywgaWYgaW5jbHVkZXMgMHMKICBtdXRhdGUoZXlldHJfdmFsdWUgPSAgcG1heChleWV0cl92YWx1ZSwgMSksCiAgICAgICAgIG1vdHJfdmFsdWUgPSBwbWF4KG1vdHJfdmFsdWUsIDEpCiAgKSAlPiUKICBtdXRhdGUoZXlldHJfdmFsdWVfbG9nID0gbG9nKGV5ZXRyX3ZhbHVlKSwKICAgICAgICAgbW90cl92YWx1ZV9sb2cgPSBsb2cobW90cl92YWx1ZSkpCnByaW50KGNvci50ZXN0KHRkX2RmJGV5ZXRyX3ZhbHVlLCB0ZF9kZiRtb3RyX3ZhbHVlKSRlc3RpbWF0ZSkKcHJpbnQoY29yLnRlc3QodGRfZGYkZXlldHJfdmFsdWVfbG9nLCB0ZF9kZiRtb3RyX3ZhbHVlX2xvZykkZXN0aW1hdGUpCgp0ZF9kZiAlPiUgCiAgZ2F0aGVyKG1lYXN1cmUsIHZhbHVlLCAxMjoxNSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdmFsdWUpKSArCiAgZ2VvbV9kZW5zaXR5KCkgKwogIGZhY2V0X3dyYXAofm1lYXN1cmUsIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpCgp0ZF90ZW1wIDwtIHRkX2RmW2MoImV5ZXRyX3ZhbHVlIiwgIm1vdHJfdmFsdWUiKV0gJT4lIGRhdGEubWF0cml4KCkKCnRkX3RlbXBfbG9nIDwtIHRkX2RmW2MoImV5ZXRyX3ZhbHVlX2xvZyIsICJtb3RyX3ZhbHVlX2xvZyIpXSAlPiUKIG11dGF0ZShleWV0cl92YWx1ZV9sb2cgPSBleWV0cl92YWx1ZV9sb2cgLSBtZWFuKGV5ZXRyX3ZhbHVlX2xvZyksIAogICAgICAgIG1vdHJfdmFsdWVfbG9nID0gbW90cl92YWx1ZV9sb2cgLSBtZWFuKG1vdHJfdmFsdWVfbG9nKSkgJT4lCiAgZGF0YS5tYXRyaXgoKQoKIyBTZXQgdXAgdGhlIHBsb3R0aW5nIGFyZWEgd2l0aCB0d28gc2lkZS1ieS1zaWRlIHBsb3RzCnBhcihtZnJvdyA9IGMoMSwgMikpCiMgUGxvdCB0aGUgZmlyc3QgZGF0YSBtYXRyaXggdGRfdGVtcApwbG90KHRkX3RlbXAsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsCiAgICAgbWFpbiA9ICJOb3QgTG9nLVRyYW5zZm9ybWVkIikKIyBQbG90IHRoZSBzZWNvbmQgZGF0YSBtYXRyaXggdGRfdGVtcF9sb2cKcGxvdCh0ZF90ZW1wX2xvZywgcGNoID0gMTYsIGNvbCA9ICJyZWQiLAogICAgIG1haW4gPSAiQ2VudGVyZWQgTG9nLVRyYW5zZm9ybWVkIikKYGBgCgpgYGB7ciwgZXZhbD1GQUxTRX0KIyAtLS0tLS0tZml0IG1vZGVsIHRvdGFsIGR1cmF0aW9uIC0tLS0tLS0tLS0KdGRfZGF0YSA9IGxpc3QoeD10ZF90ZW1wLCBOPW5yb3codGRfdGVtcCkpCmZpdF90ZCA9IHN0YW4oCiAgZmlsZT0ic3Rhbl9tb2RlbHMvYml2YXJpYXRlX2NvcnJlbGF0aW9uLnN0YW4iLCAKICBkYXRhPXRkX2RhdGEsIAogIGl0ZXI9NDAwMCwgCiAgY2hhaW5zPTQsIAogIGNvcmVzPTgsCiAgc2VlZD00NDQsCiAgIyBjb250cm9sPWxpc3QoYWRhcHRfZGVsdGE9MC45OSksIAogIHZlcmJvc2UgPSBGQUxTRQogICkKCiMgU2F2ZSB0aGUgbW9kZWwgCmZpdF90ZEBzdGFubW9kZWxAZHNvIDwtIG5ldygiY3h4ZHNvIikKc2F2ZVJEUyhmaXRfdGQsIGZpbGUgPSBwYXN0ZTAoIm1vdHJfZXlldHJfdG90YWxfZHVyYXRpb25fY29yLnJkcyIpKQpgYGAKCmBgYHtyfQpwcmludCgiRmlyc3QgUGFzcyBSZWdyZXNzaW9uIFByb2IuIikKcmVnX2RmID0gcHJvdm9fZGYgJT4lIGZpbHRlcihtZXRyaWMgPT0gIkZQUmVnIikgJT4lIAogIHNwcmVhZChtZWFzdXJlLCB2YWx1ZSkgJT4lCiAgIyBmaWx0ZXIoZXlldHJfdmFsdWUgPiAwLCBtb3RyX3ZhbHVlID4gMCkKICBtdXRhdGUoZXlldHJfdmFsdWUgPSAgcG1heChleWV0cl92YWx1ZSwgMWUtNSksCiAgICAgICAgIG1vdHJfdmFsdWUgPSBwbWF4KG1vdHJfdmFsdWUsIDFlLTUpKQpwcmludChjb3IudGVzdChyZWdfZGYkZXlldHJfdmFsdWUsIHJlZ19kZiRtb3RyX3ZhbHVlKSRlc3RpbWF0ZSkKCiMgVmlldyhyZWdfZGYpCnJlZ19kZiAlPiUgCiAgZ2F0aGVyKG1lYXN1cmUsIHZhbHVlLCAxMjoxMykgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdmFsdWUpKSArCiAgZ2VvbV9kZW5zaXR5KCkgKwogIGZhY2V0X3dyYXAofm1lYXN1cmUsIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpCgpyZWdfdGVtcCA8LSByZWdfZGZbYygiZXlldHJfdmFsdWUiLCAibW90cl92YWx1ZSIpXSAlPiUgZGF0YS5tYXRyaXgoKQoKIyBTZXQgdXAgdGhlIHBsb3R0aW5nIGFyZWEgd2l0aCB0d28gc2lkZS1ieS1zaWRlIHBsb3RzCnBhcihtZnJvdyA9IGMoMSwgMikpCiMgUGxvdCB0aGUgZmlyc3QgZGF0YSBtYXRyaXggdGRfdGVtcApwbG90KHJlZ190ZW1wLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLAogICAgIG1haW4gPSAiTm90IExvZy1UcmFuc2Zvcm1lZCIpCmBgYAoKYGBge3IsIGV2YWw9RkFMU0V9CiMgLS0tLS0tLWZpdCBtb2RlbCBGUFJlZyAtLS0tLS0tLS0tCnJlZ19kYXRhID0gbGlzdCh4PXJlZ190ZW1wLCBOPW5yb3cocmVnX3RlbXApKQpmaXRfcmVnID0gc3RhbigKICBmaWxlPSJzdGFuX21vZGVscy9iaXZhcmlhdGVfYmV0YV9jb3JyZWxhdGlvbl9yZWcuc3RhbiIsIAogIGRhdGE9cmVnX2RhdGEsIAogIGl0ZXI9NDAwMCwgCiAgY2hhaW5zPTQsIAogIGNvcmVzPTgsCiAgc2VlZD00NDQsCiAgIyBjb250cm9sPWxpc3QoYWRhcHRfZGVsdGE9MC45OSksIAogIHZlcmJvc2UgPSBGQUxTRQogICkKCiMgU2F2ZSB0aGUgbW9kZWwgCmZpdF9yZWdAc3Rhbm1vZGVsQGRzbyA8LSBuZXcoImN4eGRzbyIpCnNhdmVSRFMoZml0X3JlZywgZmlsZSA9IHBhc3RlMCgibW90cl9leWV0cl9GUFJlZ19jb3JfZHJvcDBzLnJkcyIpKQpgYGAKCgoKYGBge3J9CiMgbW9kZWxzIHdpdGggYWxsIDBzCmZpdF9nZCA9IHJlYWRSRFMoIi4vbW90cl9leWV0cl9nYXplX2R1cmF0aW9uX2Nvci5yZHMiKQpmaXRfZ3B0ID0gcmVhZFJEUygiLi9tb3RyX2V5ZXRyX2dvX3Bhc3RfdGltZV9jb3IucmRzIikKZml0X3RkID0gcmVhZFJEUygiLi9tb3RyX2V5ZXRyX3RvdGFsX2R1cmF0aW9uX2Nvci5yZHMiKQpmaXRfcmVnID0gcmVhZFJEUygiLi9tb3RyX2V5ZXRyX0ZQUmVnX2Nvci5yZHMiKQoKIyBtb2RlbHMgZm9yIGRyb3AgMHMKIyBmaXRfZ2QgPSByZWFkUkRTKCIuL21vdHJfZXlldHJfZ2F6ZV9kdXJhdGlvbl9jb3JfZHJvcDBzLnJkcyIpCiMgZml0X2dwdCA9IHJlYWRSRFMoIi4vbW90cl9leWV0cl9nb19wYXN0X3RpbWVfY29yX2Ryb3Awcy5yZHMiKQojIGZpdF90ZCA9IHJlYWRSRFMoIi4vbW90cl9leWV0cl90b3RhbF9kdXJhdGlvbl9jb3JfZHJvcDBzLnJkcyIpCiMgZml0X3JlZyA9IHJlYWRSRFMoIi4vbW90cl9leWV0cl9GUFJlZ19jb3JfZHJvcDBzLnJkcyIpCgpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHYXplIER1cmF0aW9uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpwcmludChmaXRfZ2QpCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdvIFBhc3QgVGltZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKcHJpbnQoZml0X2dwdCkKcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVG90YWwgRHVyYXRpb24tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCnByaW50KGZpdF90ZCkKcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmlyc3QgUGFzcyBSZWdyZXNzaW9uIFByb2IuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpwcmludChmaXRfcmVnKQoKYGBgCgpgYGB7ciwgZXZhbD1GQUxTRX0KIyBzdGFuX3RyYWNlKGZpdF9nZCwgcGFycz1jKCJyaG8iLCAibXUiLCAic2lnbWEiLCAibnUiKSkKIyBzdGFuX2RlbnMoZml0X2dkLCBwYXJzPWMoInJobyIsICJtdSIsICJzaWdtYSIsICJudSIpLCBzZXBhcmF0ZV9jaGFpbnMgPSBUUlVFKQojIHN0YW5fcGxvdChmaXRfZ2QsIHBhcnM9YygicmhvIiwgIm11IiwgInNpZ21hIiwgIm51IikpCgojIEdhemUgRHVyYXRpb24Kc3Rhbl90cmFjZShmaXRfZ2QpCnN0YW5fZGVucyhmaXRfZ2QsIHNlcGFyYXRlX2NoYWlucyA9IFRSVUUpCnN0YW5fcGxvdChmaXRfZ2QpCgojIEdvIFBhc3QgVGltZQpzdGFuX3RyYWNlKGZpdF9ncHQpCnN0YW5fZGVucyhmaXRfZ3B0LCBzZXBhcmF0ZV9jaGFpbnMgPSBUUlVFKQpzdGFuX3Bsb3QoZml0X2dwdCkKCiMgVG90YWwgRHVyYXRpb24Kc3Rhbl90cmFjZShmaXRfdGQpCnN0YW5fZGVucyhmaXRfdGQsIHNlcGFyYXRlX2NoYWlucyA9IFRSVUUpCnN0YW5fcGxvdChmaXRfdGQpCgojIEZQUmVnCnN0YW5fdHJhY2UoZml0X3JlZykKc3Rhbl9kZW5zKGZpdF9yZWcsIHNlcGFyYXRlX2NoYWlucyA9IFRSVUUpCnN0YW5fcGxvdChmaXRfcmVnKQoKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTUsIGZpZy5oZWlnaHQ9MTAsIGV2YWw9RkFMU0V9CnAxIDwtIHN0YW5fdHJhY2UoZml0X2dkLCBwYXJzID0gJ3JobycsIGluY193YXJtdXAgPSBGQUxTRSkKcDIgPC0gc3Rhbl9kZW5zKGZpdF9nZCwgcGFycyA9ICdyaG8nLCBzZXBhcmF0ZV9jaGFpbnMgPSBUUlVFKQpwMyA8LSBzdGFuX3RyYWNlKGZpdF9nZCwgcGFycyA9ICdtdVsxXScsIGluY193YXJtdXAgPSBGQUxTRSkKcDQgPC0gc3Rhbl9kZW5zKGZpdF9nZCwgcGFycyA9ICdtdVsxXScsIHNlcGFyYXRlX2NoYWlucyA9IFRSVUUpCnA1IDwtIHN0YW5fdHJhY2UoZml0X2dkLCBwYXJzID0gJ211WzJdJywgaW5jX3dhcm11cCA9IEZBTFNFKQpwNiA8LSBzdGFuX2RlbnMoZml0X2dkLCBwYXJzID0gJ211WzJdJywgc2VwYXJhdGVfY2hhaW5zID0gVFJVRSkKcDcgPC0gc3Rhbl90cmFjZShmaXRfZ2QsIHBhcnMgPSAnc2lnbWFbMV0nLCBpbmNfd2FybXVwID0gRkFMU0UpCnA4IDwtIHN0YW5fZGVucyhmaXRfZ2QsIHBhcnMgPSAnc2lnbWFbMV0nLCBzZXBhcmF0ZV9jaGFpbnMgPSBUUlVFKQpwOSA8LSBzdGFuX3RyYWNlKGZpdF9nZCwgcGFycyA9ICdzaWdtYVsyXScsIGluY193YXJtdXAgPSBGQUxTRSkKcDEwIDwtIHN0YW5fZGVucyhmaXRfZ2QsIHBhcnMgPSAnc2lnbWFbMl0nLCBzZXBhcmF0ZV9jaGFpbnMgPSBUUlVFKQpwMTEgPC0gc3Rhbl90cmFjZShmaXRfZ2QsIHBhcnMgPSAnbnUnLCBpbmNfd2FybXVwID0gRkFMU0UpCnAxMiA8LSBzdGFuX2RlbnMoZml0X2dkLCBwYXJzID0gJ251Jywgc2VwYXJhdGVfY2hhaW5zID0gVFJVRSkKCgojIFVzZSBncmlkLmFycmFuZ2UoKSB0byBhcnJhbmdlIHRoZSBwbG90cwojIGdyaWQuYXJyYW5nZShwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5LCBwMTAsIHAxMSwgcDEyLCBuY29sPTIsIG5yb3c9NikKCmBgYAoKCmBgYHtyfQpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHYXplIER1cmF0aW9uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpyaG9fZ2QgPSBhcy5udW1lcmljKGV4dHJhY3QoZml0X2dkLCAicmhvIilbWzFdXSkKbWVhbiA9IG1lYW4ocmhvX2dkKQpjckkgPSBxdWFudGlsZShyaG9fZ2QsIGMoLjAyNSwgLjk3NSkpCmhwZDk5ID0gSFBEaW50ZXJ2YWwoYXMubWNtYyhyaG9fZ2QpLCBwcm9iPTAuOTUpCmNhdCgiTWVhbjogIiwgbWVhbiwgIlxuSFBEOiBbIiwgaHBkOTlbLCJsb3dlciJdLCAiLCAiLCBocGQ5OVssInVwcGVyIl0sICJdIiwgc2VwPSIiLCAiXG5jckk6IFsiLCBjcklbMV0sICIsICIsIGNySVsyXSwgIl1cbiIpCgpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbyBQYXN0IFRpbWUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCnJob19ncHQgPSBhcy5udW1lcmljKGV4dHJhY3QoZml0X2dwdCwgInJobyIpW1sxXV0pCm1lYW4gPSBtZWFuKHJob19ncHQpCmNySSA9IHF1YW50aWxlKHJob19ncHQsIGMoLjAyNSwgLjk3NSkpCmhwZDk5ID0gSFBEaW50ZXJ2YWwoYXMubWNtYyhyaG9fZ3B0KSwgcHJvYj0wLjk1KQpjYXQoIk1lYW46ICIsIG1lYW4sICJcbkhQRDogWyIsIGhwZDk5WywibG93ZXIiXSwgIiwgIiwgaHBkOTlbLCJ1cHBlciJdLCAiXSIsIHNlcD0iIiwgIlxuY3JJOiBbIiwgY3JJWzFdLCAiLCAiLCBjcklbMl0sICJdXG4iKQoKcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVG90YWwgRHVyYXRpb24tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCnJob190ZCA9IGFzLm51bWVyaWMoZXh0cmFjdChmaXRfdGQsICJyaG8iKVtbMV1dKQptZWFuID0gbWVhbihyaG9fdGQpCmNySSA9IHF1YW50aWxlKHJob190ZCwgYyguMDI1LCAuOTc1KSkKaHBkOTkgPSBIUERpbnRlcnZhbChhcy5tY21jKHJob190ZCksIHByb2I9MC45NSkKY2F0KCJNZWFuOiAiLCBtZWFuLCAiXG5IUEQ6IFsiLCBocGQ5OVssImxvd2VyIl0sICIsICIsIGhwZDk5WywidXBwZXIiXSwgIl0iLCBzZXA9IiIsICJcbmNySTogWyIsIGNySVsxXSwgIiwgIiwgY3JJWzJdLCAiXVxuIikKCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpcnN0IFBhc3MgUmVncmVzc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCnJob19yZWcgPSBhcy5udW1lcmljKGV4dHJhY3QoZml0X3JlZywgInJob1sxLCAyXSIpW1sxXV0pCm1lYW4gPSBtZWFuKHJob19yZWcpCmNySSA9IHF1YW50aWxlKHJob19yZWcsIGMoLjAyNSwgLjk3NSkpCmhwZDk5ID0gSFBEaW50ZXJ2YWwoYXMubWNtYyhyaG9fcmVnKSwgcHJvYj0wLjk1KQpjYXQoIk1lYW46ICIsIG1lYW4sICJcbkhQRDogWyIsIGhwZDk5WywibG93ZXIiXSwgIiwgIiwgaHBkOTlbLCJ1cHBlciJdLCAiXSIsIHNlcD0iIiwgIlxuY3JJOiBbIiwgY3JJWzFdLCAiLCAiLCBjcklbMl0sICJdIikKCmBgYAoKCmBgYHtyfQpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHYXplIER1cmF0aW9uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpnZF9yYW5kIDwtIGV4dHJhY3QoZml0X2dkLCAieF9yYW5kIilbWzFdXQojIHhfcmFuZF9maWx0ZXJlZCA8LSB4X3JhbmRbYXBwbHkoeF9yYW5kLCAxLCBmdW5jdGlvbih4KSBhbGwoeCA+IDApKSxdCiMgeF9yYW5kX2ZpbHRlcmVkCgojIGNyZWF0ZSBhIGJsYW5rIHBsb3QgZmlyc3Qgd2l0aCBhcHByb3ByaWF0ZSBsaW1pdHMKcGxvdCgxLCAxLCB4bGltPWMoMCwgNDAwKSwgeWxpbT1jKDAsIDcwMCksIHR5cGU9Im4iLAogICAgIHhsYWIgPSAiRXllIHRyYWNraW5nIHZhbHVlIiwgeWxhYiA9ICJNb1RSIHZhbHVlIiwgbWFpbiA9ICJHYXplIER1cmF0aW9uIikgIyAndHlwZSA9ICJuIicgbWFrZXMgc3VyZSB0aGUgcGxvdCBpcyBibGFuawoKIyBhZGQgcG9pbnRzIGZvciB4X3JhbmQgd2l0aCBjb2xvciAKcG9pbnRzKGdkX3JhbmRbLDFdLCBnZF9yYW5kWywyXSwgY29sID0gImJsYWNrIiwgcGNoID0gMTYpCiMgYWRkIHBvaW50cyBmb3IgZ2RfdGVtcCB3aXRoIGNvbG9yIHJlZApwb2ludHMoZ2RfdGVtcCwgcGNoPTE2LCBjb2w9InJlZCIpCgojIGFkZCBkYXRhRWxsaXBzZSB3aXRoIGNvbG9yIApkYXRhRWxsaXBzZShnZF9yYW5kLCBsZXZlbHMgPSBjKDAuNSwgMC43NSksIGZpbGw9VCwgcGxvdC5wb2ludHMgPSBGLCBjb2w9Im9yYW5nZSIpCmRhdGFFbGxpcHNlKGdkX3JhbmQsIGxldmVscyA9IGMoMC45NSwgMC45OSksIGZpbGw9VCwgcGxvdC5wb2ludHMgPSBGLCBjb2w9ImJsdWUiKQoKcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR28gUGFzdCBUaW1lLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpncHRfcmFuZCA8LSBleHRyYWN0KGZpdF9ncHQsICJ4X3JhbmQiKVtbMV1dCgojIGNyZWF0ZSBhIGJsYW5rIHBsb3QgZmlyc3Qgd2l0aCBhcHByb3ByaWF0ZSBsaW1pdHMKcGxvdCgxLCAxLCB4bGltPWMoMCwgODAwKSwgeWxpbT1jKDAsIDEyMDApLCB0eXBlPSJuIiwKICAgICB4bGFiID0gIkV5ZSB0cmFja2luZyB2YWx1ZSIsIHlsYWIgPSAiTW9UUiB2YWx1ZSIsIG1haW4gPSAiR28gUGFzdCBUaW1lIikgIyAndHlwZSA9ICJuIicgbWFrZXMgc3VyZSB0aGUgcGxvdCBpcyBibGFuawoKIyBhZGQgcG9pbnRzIGZvciB4X3JhbmQgd2l0aCBjb2xvciAKcG9pbnRzKGdwdF9yYW5kWywxXSwgZ3B0X3JhbmRbLDJdLCBjb2wgPSAiYmxhY2siLCBwY2ggPSAxNikKIyBhZGQgcG9pbnRzIGZvciBnZF90ZW1wIHdpdGggY29sb3IgcmVkCnBvaW50cyhncHRfdGVtcCwgcGNoPTE2LCBjb2w9InJlZCIpCgojIGFkZCBkYXRhRWxsaXBzZSB3aXRoIGNvbG9yIApkYXRhRWxsaXBzZShncHRfcmFuZCwgbGV2ZWxzID0gYygwLjUsIDAuNzUpLCBmaWxsPVQsIHBsb3QucG9pbnRzID0gRiwgY29sPSJvcmFuZ2UiKQpkYXRhRWxsaXBzZShncHRfcmFuZCwgbGV2ZWxzID0gYygwLjk1LCAwLjk5KSwgZmlsbD1ULCBwbG90LnBvaW50cyA9IEYsIGNvbD0iYmx1ZSIpCgpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUb3RhbCBEdXJhdGlvbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKdGRfcmFuZCA8LSBleHRyYWN0KGZpdF90ZCwgInhfcmFuZCIpW1sxXV0KCiMgY3JlYXRlIGEgYmxhbmsgcGxvdCBmaXJzdCB3aXRoIGFwcHJvcHJpYXRlIGxpbWl0cwpwbG90KDEsIDEsIHhsaW09YygwLCA4MDApLCB5bGltPWMoMCwgMTIwMCksIHR5cGU9Im4iLAogICAgIHhsYWIgPSAiRXllIHRyYWNraW5nIHZhbHVlIiwgeWxhYiA9ICJNb1RSIHZhbHVlIiwgbWFpbiA9ICJUb3RhbCBEdXJhdGlvbiIpICMgJ3R5cGUgPSAibiInIG1ha2VzIHN1cmUgdGhlIHBsb3QgaXMgYmxhbmsKCiMgYWRkIHBvaW50cyBmb3IgeF9yYW5kIHdpdGggY29sb3IgCnBvaW50cyh0ZF9yYW5kWywxXSwgdGRfcmFuZFssMl0sIGNvbCA9ICJibGFjayIsIHBjaCA9IDE2KQojIGFkZCBwb2ludHMgZm9yIGdkX3RlbXAgd2l0aCBjb2xvciByZWQKcG9pbnRzKHRkX3RlbXAsIHBjaD0xNiwgY29sPSJyZWQiKQoKIyBhZGQgZGF0YUVsbGlwc2Ugd2l0aCBjb2xvciAKZGF0YUVsbGlwc2UodGRfcmFuZCwgbGV2ZWxzID0gYygwLjUsIDAuNzUpLCBmaWxsPVQsIHBsb3QucG9pbnRzID0gRiwgY29sPSJvcmFuZ2UiKQpkYXRhRWxsaXBzZSh0ZF9yYW5kLCBsZXZlbHMgPSBjKDAuOTUsIDAuOTkpLCBmaWxsPVQsIHBsb3QucG9pbnRzID0gRiwgY29sPSJibHVlIikKCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpcnN0IFBhc3MgUmVncmVzc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCnJlZ19yYW5kIDwtIGV4dHJhY3QoZml0X3JlZywgInhfcmFuZCIpW1sxXV0KCiMgY3JlYXRlIGEgYmxhbmsgcGxvdCBmaXJzdCB3aXRoIGFwcHJvcHJpYXRlIGxpbWl0cwpwbG90KDEsIDEsIHhsaW09YygwLCAxKSwgeWxpbT1jKDAsIDEpLCB0eXBlPSJuIiwKICAgICB4bGFiID0gIkV5ZSB0cmFja2luZyB2YWx1ZSIsIHlsYWIgPSAiTW9UUiB2YWx1ZSIsIG1haW4gPSAiRlBSZWciKSAjICd0eXBlID0gIm4iJyBtYWtlcyBzdXJlIHRoZSBwbG90IGlzIGJsYW5rCgojIGFkZCBwb2ludHMgZm9yIHhfcmFuZCB3aXRoIGNvbG9yIApwb2ludHMocmVnX3JhbmRbLDFdLCByZWdfcmFuZFssMl0sIGNvbCA9ICJibGFjayIsIHBjaCA9IDE2KQojIGFkZCBwb2ludHMgZm9yIGdkX3RlbXAgd2l0aCBjb2xvciByZWQKcG9pbnRzKHJlZ190ZW1wLCBwY2g9MTYsIGNvbD0icmVkIikKCiMgYWRkIGRhdGFFbGxpcHNlIHdpdGggY29sb3IgCmRhdGFFbGxpcHNlKHJlZ19yYW5kLCBsZXZlbHMgPSBjKDAuNSwgMC43NSksIGZpbGw9VCwgcGxvdC5wb2ludHMgPSBGLCBjb2w9Im9yYW5nZSIpCmRhdGFFbGxpcHNlKHJlZ19yYW5kLCBsZXZlbHMgPSBjKDAuOTUsIDAuOTkpLCBmaWxsPVQsIHBsb3QucG9pbnRzID0gRiwgY29sPSJibHVlIikKCgpgYGAKCiMgbW9kZWwgbW90ciBleWV0ciBGUFJlZyBjb3JyZWxhdGlvbiAoZXlldHIgPCAwLjMpCmBgYHtyfQpwcmludCgiRmlyc3QgUGFzcyBSZWdyZXNzaW9uIFByb2IuIGFsbCBhbmQgIDwgMC4zIikKcmVnX2RmX2FsbCA9IHByb3ZvX2RmICU+JSBmaWx0ZXIobWV0cmljID09ICJGUFJlZyIpICU+JSAKICBzcHJlYWQobWVhc3VyZSwgdmFsdWUpICU+JQogICMgZmlsdGVyKGV5ZXRyX3ZhbHVlID4gMCwgbW90cl92YWx1ZSA+IDApICU+JQogICMgbXV0YXRlKGV5ZXRyX3ZhbHVlID0gIHBtYXgoZXlldHJfdmFsdWUsIDFlLTUpLAogICAgICAgICAjIG1vdHJfdmFsdWUgPSBwbWF4KG1vdHJfdmFsdWUsIDFlLTUpKQogIG11dGF0ZShzX2V5ZXRyX3ZhbHVlID0gc2NhbGUoZXlldHJfdmFsdWUpLAogICAgICAgICBzX21vdHJfdmFsdWUgPSBzY2FsZShtb3RyX3ZhbHVlKSkKCnJlZ19kZl9hbGxfZHJvcDBzID0gcHJvdm9fZGYgJT4lIGZpbHRlcihtZXRyaWMgPT0gIkZQUmVnIikgJT4lIAogIHNwcmVhZChtZWFzdXJlLCB2YWx1ZSkgJT4lCiAgZmlsdGVyKGV5ZXRyX3ZhbHVlID4gMCwgbW90cl92YWx1ZSA+IDApICU+JQogICMgbXV0YXRlKGV5ZXRyX3ZhbHVlID0gIHBtYXgoZXlldHJfdmFsdWUsIDFlLTUpLAogICAgICAgICAjIG1vdHJfdmFsdWUgPSBwbWF4KG1vdHJfdmFsdWUsIDFlLTUpKQogIG11dGF0ZShzX2V5ZXRyX3ZhbHVlID0gc2NhbGUoZXlldHJfdmFsdWUpLAogICAgICAgICBzX21vdHJfdmFsdWUgPSBzY2FsZShtb3RyX3ZhbHVlKSkKCnJlZ19kZl9sb3dfZHJvcDAgPSBwcm92b19kZiAlPiUgZmlsdGVyKG1ldHJpYyA9PSAiRlBSZWciKSAlPiUgCiAgc3ByZWFkKG1lYXN1cmUsIHZhbHVlKSAlPiUKICBmaWx0ZXIoZXlldHJfdmFsdWUgPiAwLCBtb3RyX3ZhbHVlID4gMCkgJT4lCiAgbXV0YXRlKGV5ZXRyX3ZhbHVlID0gIHBtYXgoZXlldHJfdmFsdWUsIDFlLTUpLAogICAgICAgICBtb3RyX3ZhbHVlID0gcG1heChtb3RyX3ZhbHVlLCAxZS01KSkgJT4lCiAgZmlsdGVyKGV5ZXRyX3ZhbHVlIDwgMC4zKQoKcmVnX2RmX2xvdyA9IHByb3ZvX2RmICU+JSBmaWx0ZXIobWV0cmljID09ICJGUFJlZyIpICU+JSAKICBzcHJlYWQobWVhc3VyZSwgdmFsdWUpICU+JQogICMgZmlsdGVyKGV5ZXRyX3ZhbHVlID4gMCwgbW90cl92YWx1ZSA+IDApICU+JQogIG11dGF0ZShleWV0cl92YWx1ZSA9ICBwbWF4KGV5ZXRyX3ZhbHVlLCAxZS01KSwKICAgICAgICAgbW90cl92YWx1ZSA9IHBtYXgobW90cl92YWx1ZSwgMWUtNSkpICU+JQogIGZpbHRlcihleWV0cl92YWx1ZSA8IDAuMykKICAjIG11dGF0ZShleWV0cl92YWx1ZSA9IGV4cChleWV0cl92YWx1ZSksCiAgICAgICAgICMgbW90cl92YWx1ZSA9IGV4cChtb3RyX3ZhbHVlKQogICAgICAgICAjICkKIyBWaWV3KHJlZ19kZikKCnByaW50KGNvci50ZXN0KHJlZ19kZl9hbGwkZXlldHJfdmFsdWUsIHJlZ19kZl9hbGwkbW90cl92YWx1ZSkkZXN0aW1hdGUpCnByaW50KGNvci50ZXN0KHJlZ19kZl9hbGwkZXlldHJfdmFsdWUsIHJlZ19kZl9hbGwkbW90cl92YWx1ZSkkcC52YWx1ZSkKcHJpbnQoY29yLnRlc3QocmVnX2RmX2FsbCRzX2V5ZXRyX3ZhbHVlLCByZWdfZGZfYWxsJHNfbW90cl92YWx1ZSkkZXN0aW1hdGUpCnByaW50KGNvci50ZXN0KHJlZ19kZl9hbGwkc19leWV0cl92YWx1ZSwgcmVnX2RmX2FsbCRzX21vdHJfdmFsdWUpJHAudmFsdWUpCnByaW50KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCnByaW50KGNvci50ZXN0KHJlZ19kZl9hbGxfZHJvcDBzJGV5ZXRyX3ZhbHVlLCByZWdfZGZfYWxsX2Ryb3AwcyRtb3RyX3ZhbHVlKSRlc3RpbWF0ZSkKcHJpbnQoY29yLnRlc3QocmVnX2RmX2FsbF9kcm9wMHMkZXlldHJfdmFsdWUsIHJlZ19kZl9hbGxfZHJvcDBzJG1vdHJfdmFsdWUpJHAudmFsdWUpCnByaW50KGNvci50ZXN0KHJlZ19kZl9hbGxfZHJvcDBzJHNfZXlldHJfdmFsdWUsIHJlZ19kZl9hbGxfZHJvcDBzJHNfbW90cl92YWx1ZSkkZXN0aW1hdGUpCnByaW50KGNvci50ZXN0KHJlZ19kZl9hbGxfZHJvcDBzJHNfZXlldHJfdmFsdWUsIHJlZ19kZl9hbGxfZHJvcDBzJHNfbW90cl92YWx1ZSkkcC52YWx1ZSkKIyBwcmludChjb3IudGVzdChyZWdfZGZfbG93JGV5ZXRyX3ZhbHVlLCByZWdfZGZfbG93JG1vdHJfdmFsdWUpJGVzdGltYXRlKQojIHByaW50KGNvci50ZXN0KHJlZ19kZl9sb3ckZXlldHJfdmFsdWUsIHJlZ19kZl9sb3ckbW90cl92YWx1ZSkkcC52YWx1ZSkKIyBwcmludChjb3IudGVzdChyZWdfZGZfbG93X2Ryb3AwJGV5ZXRyX3ZhbHVlLCByZWdfZGZfbG93X2Ryb3AwJG1vdHJfdmFsdWUpJGVzdGltYXRlKQojIHByaW50KGNvci50ZXN0KHJlZ19kZl9sb3dfZHJvcDAkZXlldHJfdmFsdWUsIHJlZ19kZl9sb3dfZHJvcDAkbW90cl92YWx1ZSkkcC52YWx1ZSkKCiMgVmlldyhyZWdfZGYpCnJlZ19kZl9sb3cgJT4lIAogIGdhdGhlcihtZWFzdXJlLCB2YWx1ZSwgMTI6MTMpICU+JQogIGdncGxvdChhZXMoeCA9IHZhbHVlKSkgKwogIGdlb21fZGVuc2l0eSgpICsKICBmYWNldF93cmFwKH5tZWFzdXJlLCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9idygpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDEiKQoKcmVnX3RlbXBfYWxsIDwtIHJlZ19kZl9hbGxbYygiZXlldHJfdmFsdWUiLCAibW90cl92YWx1ZSIpXSAlPiUgZGF0YS5tYXRyaXgoKQpyZWdfdGVtcF9hbGxfc2NhbGVkIDwtIHJlZ19kZl9hbGxbYygic19leWV0cl92YWx1ZSIsICJzX21vdHJfdmFsdWUiKV0gJT4lIGRhdGEubWF0cml4KCkKcmVnX3RlbXBfbG93IDwtIHJlZ19kZl9sb3dbYygiZXlldHJfdmFsdWUiLCAibW90cl92YWx1ZSIpXSAlPiUgZGF0YS5tYXRyaXgoKQpyZWdfdGVtcF9sb3dfZHJvcDAgPC0gcmVnX2RmX2xvd19kcm9wMFtjKCJleWV0cl92YWx1ZSIsICJtb3RyX3ZhbHVlIildICU+JSBkYXRhLm1hdHJpeCgpCgojIFNldCB1cCB0aGUgcGxvdHRpbmcgYXJlYSB3aXRoIHR3byBzaWRlLWJ5LXNpZGUgcGxvdHMKcGFyKG1mcm93ID0gYygxLCAyKSkKIyBQbG90IHRoZSBmaXJzdCBkYXRhIG1hdHJpeCB0ZF90ZW1wCiMgcGxvdChyZWdfdGVtcF9sb3csIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsCiMgICAgICBtYWluID0gIk5vdCBMb2ctVHJhbnNmb3JtZWQiKQpwbG90KHJlZ190ZW1wX2FsbCwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwKICAgICBtYWluID0gIk9yaWdpbmFsIGRhdGEiKQpwbG90KHJlZ190ZW1wX2FsbF9zY2FsZWQsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsCiAgICAgbWFpbiA9ICIwLTEgc2NhbGVkIGRhdGEiKQoKYGBgCgpgYGB7ciwgZXZhbD1GQUxTRX0KIyAtLS0tLS0tZml0IG1vZGVsIEZQUmVnIDwgMC4zIC0tLS0tLS0tLS0KcmVnX2RhdGEgPSBsaXN0KHg9cmVnX3RlbXBfYWxsLCBOPW5yb3cocmVnX3RlbXBfYWxsKSkKZml0X3JlZyA9IHN0YW4oCiAgIyBmaWxlPSJzdGFuX21vZGVscy9iaXZhcmlhdGVfYmV0YV9jb3JyZWxhdGlvbl9yZWcuc3RhbiIsIAogIGZpbGUgPSAic3Rhbl9tb2RlbHMvYml2YXJpYXRlX25vcm1hbF9yZWcuc3RhbiIsCiAgZGF0YT1yZWdfZGF0YSwgCiAgaXRlcj00MDAwLCAKICBjaGFpbnM9NCwgCiAgY29yZXM9NCwKICBzZWVkPTQ0NCwKICAjIGNvbnRyb2w9bGlzdChhZGFwdF9kZWx0YT0wLjk5KSwgCiAgdmVyYm9zZSA9IEZBTFNFCiAgKQoKIyBTYXZlIHRoZSBtb2RlbCAKZml0X3JlZ0BzdGFubW9kZWxAZHNvIDwtIG5ldygiY3h4ZHNvIikKc2F2ZVJEUyhmaXRfcmVnLCBmaWxlID0gcGFzdGUwKCJtb3RyX2V5ZXRyX0ZQUmVnX2Nvcl9hbGxfZGF0YV9kcm9wMHMucmRzIikpCmBgYAoKCiMgbW9kZWwgbW90ciBleWV0ciBGUFJlZyBjb3JyZWxhdGlvbiAoZXlldHIgPj0gMC4zKQpgYGB7cn0KcHJpbnQoIkZpcnN0IFBhc3MgUmVncmVzc2lvbiBQcm9iLiA+PSAwLjMiKQpyZWdfZGZfaGlnaF9kcm9wMCA9IHByb3ZvX2RmICU+JSBmaWx0ZXIobWV0cmljID09ICJGUFJlZyIpICU+JSAKICBzcHJlYWQobWVhc3VyZSwgdmFsdWUpICU+JQogIGZpbHRlcihleWV0cl92YWx1ZSA+IDAsIG1vdHJfdmFsdWUgPiAwKSAlPiUKICBtdXRhdGUoZXlldHJfdmFsdWUgPSAgcG1heChleWV0cl92YWx1ZSwgMWUtNSksCiAgICAgICAgIG1vdHJfdmFsdWUgPSBwbWF4KG1vdHJfdmFsdWUsIDFlLTUpKSAlPiUKICBmaWx0ZXIoZXlldHJfdmFsdWUgPj0gMC4zKQoKcmVnX2RmX2hpZ2ggPSBwcm92b19kZiAlPiUgZmlsdGVyKG1ldHJpYyA9PSAiRlBSZWciKSAlPiUgCiAgc3ByZWFkKG1lYXN1cmUsIHZhbHVlKSAlPiUKICAjIGZpbHRlcihleWV0cl92YWx1ZSA+IDAsIG1vdHJfdmFsdWUgPiAwKSAlPiUKICBtdXRhdGUoZXlldHJfdmFsdWUgPSAgcG1heChleWV0cl92YWx1ZSwgMWUtNSksCiAgICAgICAgIG1vdHJfdmFsdWUgPSBwbWF4KG1vdHJfdmFsdWUsIDFlLTUpKSAlPiUKICBmaWx0ZXIoZXlldHJfdmFsdWUgPj0gMC4zKQogICMgbXV0YXRlKGV5ZXRyX3ZhbHVlID0gZXhwKGV5ZXRyX3ZhbHVlKSwKICAgICAgICAgIyBtb3RyX3ZhbHVlID0gZXhwKG1vdHJfdmFsdWUpCiAgICAgICAgICMgKQojIFZpZXcocmVnX2RmKQojIHByaW50KCItLS0tLS0tLS0tLS0tLS0tLS0tLS1QZWFyc29uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIikKIyBwcmludChjb3IudGVzdChyZWdfZGZfaGlnaCRleWV0cl92YWx1ZSwgcmVnX2RmX2hpZ2gkbW90cl92YWx1ZSkkZXN0aW1hdGUsIG1ldGhvZD0nUGVhcnNvbicpCiMgcHJpbnQoY29yLnRlc3QocmVnX2RmX2hpZ2gkZXlldHJfdmFsdWUsIHJlZ19kZl9oaWdoJG1vdHJfdmFsdWUpJHAudmFsdWUsIG1ldGhvZD0nUGVhcnNvbicpCiMgcHJpbnQoY29yLnRlc3QocmVnX2RmX2hpZ2hfZHJvcDAkZXlldHJfdmFsdWUsIHJlZ19kZl9oaWdoX2Ryb3AwJG1vdHJfdmFsdWUpJGVzdGltYXRlLCBtZXRob2Q9J1BlYXJzb24nKQojIHByaW50KGNvci50ZXN0KHJlZ19kZl9oaWdoX2Ryb3AwJGV5ZXRyX3ZhbHVlLCByZWdfZGZfaGlnaF9kcm9wMCRtb3RyX3ZhbHVlKSRwLnZhbHVlLCBtZXRob2Q9J1BlYXJzb24nKQojIHByaW50KCItLS0tLS0tLS0tLS0tLS0tLS0tLS1TcGVhcm1hbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCiMgcHJpbnQoY29yLnRlc3QocmVnX2RmX2hpZ2gkZXlldHJfdmFsdWUsIHJlZ19kZl9oaWdoJG1vdHJfdmFsdWUpJGVzdGltYXRlLCBtZXRob2Q9J1NwZWFybWFuJykKIyBwcmludChjb3IudGVzdChyZWdfZGZfaGlnaCRleWV0cl92YWx1ZSwgcmVnX2RmX2hpZ2gkbW90cl92YWx1ZSkkcC52YWx1ZSwgbWV0aG9kPSdTcGVhcm1hbicpCiMgcHJpbnQoY29yLnRlc3QocmVnX2RmX2hpZ2hfZHJvcDAkZXlldHJfdmFsdWUsIHJlZ19kZl9oaWdoX2Ryb3AwJG1vdHJfdmFsdWUpJGVzdGltYXRlLCBtZXRob2Q9J1NwZWFybWFuJykKIyBwcmludChjb3IudGVzdChyZWdfZGZfaGlnaF9kcm9wMCRleWV0cl92YWx1ZSwgcmVnX2RmX2hpZ2hfZHJvcDAkbW90cl92YWx1ZSkkcC52YWx1ZSwgbWV0aG9kPSdTcGVhcm1hbicpCiMgcHJpbnQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLVNjYWxlZCBsbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKQojIG0uc2NhbGVkID0gbG0oc2NhbGUobW90cl92YWx1ZSkgfiAxICsgc2NhbGUoZXlldHJfdmFsdWUpLCBkYXRhID0gcmVnX2RmX2hpZ2gpCiMgc3VtbWFyeShtLnNjYWxlZCkKCgojIFZpZXcocmVnX2RmKQpyZWdfZGZfaGlnaCAlPiUgCiAgZ2F0aGVyKG1lYXN1cmUsIHZhbHVlLCAxMjoxMykgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdmFsdWUpKSArCiAgZ2VvbV9kZW5zaXR5KCkgKwogIGZhY2V0X3dyYXAofm1lYXN1cmUsIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpCgpyZWdfdGVtcF9oaWdoIDwtIHJlZ19kZl9oaWdoW2MoImV5ZXRyX3ZhbHVlIiwgIm1vdHJfdmFsdWUiKV0gJT4lIGRhdGEubWF0cml4KCkKcmVnX3RlbXBfaGlnaF9kcm9wMCA8LSByZWdfZGZfaGlnaF9kcm9wMFtjKCJleWV0cl92YWx1ZSIsICJtb3RyX3ZhbHVlIildICU+JSBkYXRhLm1hdHJpeCgpCgojIFNldCB1cCB0aGUgcGxvdHRpbmcgYXJlYSB3aXRoIHR3byBzaWRlLWJ5LXNpZGUgcGxvdHMKcGFyKG1mcm93ID0gYygxLCAzKSkKIyBQbG90IHRoZSBmaXJzdCBkYXRhIG1hdHJpeCB0ZF90ZW1wCnBsb3QocmVnX3RlbXBfYWxsLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLAogICAgIG1haW4gPSAiRlBSZWcgbm90IGxvZ2dlZCBhbGwgZGF0YSIpCnBsb3QocmVnX3RlbXBfbG93LCBwY2ggPSAxNiwgY29sID0gImJsdWUiLAogICAgIG1haW4gPSAiRlBSZWcgbm90IGxvZ2dlZCBleWV0ciA8IDAuMyAiKQpwbG90KHJlZ190ZW1wX2hpZ2gsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsCiAgICAgbWFpbiA9ICJGUFJlZyBub3QgbG9nZ2VkIGV5ZXRyID49IDAuMyIpCgpwcmludCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tUGVhcnNvbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCnByaW50KGNvci50ZXN0KHJlZ19kZl9hbGwkZXlldHJfdmFsdWUsIHJlZ19kZl9hbGwkbW90cl92YWx1ZSkkZXN0aW1hdGUsIG1ldGhvZD0nUGVhcnNvbicpCnByaW50KGNvci50ZXN0KHJlZ19kZl9hbGwkZXlldHJfdmFsdWUsIHJlZ19kZl9hbGwkbW90cl92YWx1ZSkkcC52YWx1ZSwgbWV0aG9kPSdQZWFyc29uJykKcHJpbnQoY29yLnRlc3QocmVnX2RmX2FsbF9kcm9wMHMkZXlldHJfdmFsdWUsIHJlZ19kZl9hbGxfZHJvcDBzJG1vdHJfdmFsdWUpJGVzdGltYXRlLCBtZXRob2Q9J1BlYXJzb24nKQpwcmludChjb3IudGVzdChyZWdfZGZfYWxsX2Ryb3AwcyRleWV0cl92YWx1ZSwgcmVnX2RmX2FsbF9kcm9wMHMkbW90cl92YWx1ZSkkcC52YWx1ZSwgbWV0aG9kPSdQZWFyc29uJykKCnByaW50KCItLS0tLS0tLS0tLS0tLS0tLS0tLS1TcGVhcm1hbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCgpwcmludChjb3IudGVzdChyZWdfZGZfYWxsJGV5ZXRyX3ZhbHVlLCByZWdfZGZfYWxsJG1vdHJfdmFsdWUpJGVzdGltYXRlLCBtZXRob2Q9J1NwZWFybWFuJykKcHJpbnQoY29yLnRlc3QocmVnX2RmX2FsbCRleWV0cl92YWx1ZSwgcmVnX2RmX2FsbCRtb3RyX3ZhbHVlKSRwLnZhbHVlLCBtZXRob2Q9J1NwZWFybWFuJykKcHJpbnQoY29yLnRlc3QocmVnX2RmX2FsbF9kcm9wMHMkZXlldHJfdmFsdWUsIHJlZ19kZl9hbGxfZHJvcDBzJG1vdHJfdmFsdWUpJGVzdGltYXRlLCBtZXRob2Q9J1NwZWFybWFuJykKcHJpbnQoY29yLnRlc3QocmVnX2RmX2FsbF9kcm9wMHMkZXlldHJfdmFsdWUsIHJlZ19kZl9hbGxfZHJvcDBzJG1vdHJfdmFsdWUpJHAudmFsdWUsIG1ldGhvZD0nU3BlYXJtYW4nKQpwcmludCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tU2NhbGVkIGxtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCgptLnNjYWxlZCA9IGxtKHNjYWxlKG1vdHJfdmFsdWUpIH4gMSArIHNjYWxlKGV5ZXRyX3ZhbHVlKSwgZGF0YSA9IHJlZ19kZl9hbGwpCnN1bW1hcnkobS5zY2FsZWQpCmNvZWYobS5zY2FsZWQpWzJdCnN1bW1hcnkobS5zY2FsZWQpJGNvZWZmaWNpZW50c1syLCA0XQoKCm0uc2NhbGVkX2Ryb3AwcyA9IGxtKHNjYWxlKG1vdHJfdmFsdWUpIH4gMSArIHNjYWxlKGV5ZXRyX3ZhbHVlKSwgZGF0YSA9IHJlZ19kZl9hbGxfZHJvcDBzKQpzdW1tYXJ5KG0uc2NhbGVkX2Ryb3AwcykKCiMgbS5zY2FsZWRfZHJvcDBzX2ludiA9IGxtKHNjYWxlKGV5ZXRyX3ZhbHVlKSB+IDEgKyBzY2FsZShtb3RyX3ZhbHVlKSwgZGF0YSA9IHJlZ19kZl9hbGxfZHJvcDBzKQojIHN1bW1hcnkobS5zY2FsZWRfZHJvcDBzX2ludikKYGBgCgojIGRpdmlkZSBkYXRhIGludG8gdHdvIHBhcnQsIHRoaXMgaXMgaGlnaCBwYXJ0IChleWV0ciBGUFJlZyBwcm9iLiA+PSAwLjMpCmBgYHtyLCBldmFsPUZBTFNFfQojIC0tLS0tLS1maXQgbW9kZWwgRlBSZWcgPj0gMC4zIC0tLS0tLS0tLS0KcmVnX2RhdGEgPSBsaXN0KHg9cmVnX3RlbXBfaGlnaF9kcm9wMCwgTj1ucm93KHJlZ190ZW1wX2hpZ2hfZHJvcDApKQpmaXRfcmVnID0gc3RhbigKICAjIGZpbGU9InN0YW5fbW9kZWxzL2JpdmFyaWF0ZV9iZXRhX2NvcnJlbGF0aW9uX3JlZy5zdGFuIiwgCiAgZmlsZSA9ICJzdGFuX21vZGVscy9iaXZhcmlhdGVfbm9ybWFsX3JlZy5zdGFuIiwKICBkYXRhPXJlZ19kYXRhLCAKICBpdGVyPTQwMDAsIAogIGNoYWlucz00LCAKICBjb3Jlcz00LAogIHNlZWQ9NDQ0LAogICMgY29udHJvbD1saXN0KGFkYXB0X2RlbHRhPTAuOTkpLCAKICB2ZXJib3NlID0gRkFMU0UKICApCgojIFNhdmUgdGhlIG1vZGVsIApmaXRfcmVnQHN0YW5tb2RlbEBkc28gPC0gbmV3KCJjeHhkc28iKQpzYXZlUkRTKGZpdF9yZWcsIGZpbGUgPSBwYXN0ZTAoIm1vdHJfZXlldHJfRlBSZWdfY29yXzAzLTFfZHJvcDBzLnJkcyIpKQpgYGAKCgojIHVzZSBsaW5lYXIgbW9kZWwgdG8gbW9kZWwgdGhlIGFsbCBkYXRhCmBgYHtyLCBldmFsPUZBTFNFfQoKZXhwID0gIm1vdHJfZXlldHJfRlBSZWciCgpwcmlvcnNfY29yX21vdHJfZXlldHIgPC0gYygKICBwcmlvcihub3JtYWwoMCwgMTApLCBjbGFzcyA9IEludGVyY2VwdCksCiAgcHJpb3Iobm9ybWFsKDAsIDEwKSwgY2xhc3MgPSBiKSwKICBwcmlvcihub3JtYWwoMCwgMTApLCBjbGFzcyA9IHNpZ21hKQopCgptb2RlbCA9IGJybXM6OmJybSggc2NhbGUobW90cl92YWx1ZSkgfiAxICsgc2NhbGUoZXlldHJfdmFsdWUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmVnX2RmX2FsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFpbnMgPSA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IGdhdXNzaWFuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IHBhc3RlMCgiLi90ZW1wLyIsIGV4cCwgIl9sbV93aXRoMHMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlcyA9IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2VuZCA9ICJjbWRzdGFuciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IgPSBwcmlvcnNfY29yX21vdHJfZXlldHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybXVwID0gMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyID0gNDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlX3BhcnMgPSBzYXZlX3BhcnMoYWxsID0gVFJVRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCgpgYGAKCmBgYHtyfQpwb3N0ZXJpb3Jfc2FtcGxlc19tb3RyX2V5ZXRyX2NvciA8LSBhcy5kYXRhLmZyYW1lKG1vdHJfZXlldHJfY29yKQpwb3N0ZXJpb3Jfc2FtcGxlc19tb3RyX2V5ZXRyX2NvcgojIEdldCBhbGwgdGhlIGRyYXdzIG9mIHNjYWxlZXlldHJfdmFsdWUKY29yX2RyYXdzIDwtIHBvc3Rlcmlvcl9zYW1wbGVzX21vdHJfZXlldHJfY29yJGJfc2NhbGVleWV0cl92YWx1ZSAlPiUgZGF0YS5mcmFtZSgpClZpZXcoY29yX2RyYXdzKQoKcHBfY2hlY2sobW90cl9leWV0cl9jb3IsIHR5cGUgPSAiZGVuc19vdmVybGF5IikKcHBfY2hlY2sobW90cl9leWV0cl9jb3IsIHR5cGUgPSAic2NhdHRlciIpCmBgYAoKCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVJBTks9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojIGNvcnJlbGF0ZSBtb3RyLWV5ZXRyIHJhbmtlZCBkYXRhCgpgYGB7cn0KcHJpbnQoIlJhbmsgRmlyc3QgUGFzcyBSZWdyZXNzaW9uIFByb2IuIGFsbCBkYXRhIikKcmVnX2RmX3JhbmsgPSBwcm92b19kZiAlPiUgZmlsdGVyKG1ldHJpYyA9PSAiRlBSZWciKSAlPiUgCiAgc3ByZWFkKG1lYXN1cmUsIHZhbHVlKSAlPiUKICAjIGZpbHRlcihleWV0cl92YWx1ZSA+IDAsIG1vdHJfdmFsdWUgPiAwKSAlPiUKICBtdXRhdGUoZXlldHJfcmFuayA9IHJhbmsoZXlldHJfdmFsdWUsIHRpZXMubWV0aG9kID0gIm1heCIpLCAKICAgICAgICAgbW90cl9yYW5rID0gcmFuayhtb3RyX3ZhbHVlLCB0aWVzLm1ldGhvZCA9ICJtYXgiKSkKCnJlZ19kZl9yYW5rX2Ryb3AwcyA9IHByb3ZvX2RmICU+JSBmaWx0ZXIobWV0cmljID09ICJGUFJlZyIpICU+JSAKICBzcHJlYWQobWVhc3VyZSwgdmFsdWUpICU+JQogIGZpbHRlcihleWV0cl92YWx1ZSA+IDAsIG1vdHJfdmFsdWUgPiAwKSAlPiUKICBtdXRhdGUoZXlldHJfcmFuayA9IHJhbmsoZXlldHJfdmFsdWUsIHRpZXMubWV0aG9kID0gIm1heCIpLCAKICAgICAgICAgbW90cl9yYW5rID0gcmFuayhtb3RyX3ZhbHVlLCB0aWVzLm1ldGhvZCA9ICJtYXgiKSkKClZpZXcocmVnX2RmX3JhbmspCnByaW50KGNvci50ZXN0KHJlZ19kZl9yYW5rJGV5ZXRyX3JhbmssIHJlZ19kZl9yYW5rJG1vdHJfcmFuaykkZXN0aW1hdGUpCnByaW50KGNvci50ZXN0KHJlZ19kZl9yYW5rJGV5ZXRyX3JhbmssIHJlZ19kZl9yYW5rJG1vdHJfcmFuaykkcC52YWx1ZSkKCnByaW50KGNvci50ZXN0KHJlZ19kZl9yYW5rX2Ryb3AwcyRleWV0cl9yYW5rLCByZWdfZGZfcmFua19kcm9wMHMkbW90cl9yYW5rKSRlc3RpbWF0ZSkKcHJpbnQoY29yLnRlc3QocmVnX2RmX3JhbmtfZHJvcDBzJGV5ZXRyX3JhbmssIHJlZ19kZl9yYW5rX2Ryb3AwcyRtb3RyX3JhbmspJHAudmFsdWUpCgpyZWdfZGZfcmFuayAlPiUgCiAgZ2F0aGVyKG1lYXN1cmUsIHZhbHVlLCAxNDoxNSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdmFsdWUpKSArCiAgZ2VvbV9kZW5zaXR5KCkgKwogIGZhY2V0X3dyYXAofm1lYXN1cmUsIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpCgpyZWdfZGZfcmFua19kcm9wMHMgJT4lIAogIGdhdGhlcihtZWFzdXJlLCB2YWx1ZSwgMTQ6MTUpICU+JQogIGdncGxvdChhZXMoeCA9IHZhbHVlKSkgKwogIGdlb21fZGVuc2l0eSgpICsKICBmYWNldF93cmFwKH5tZWFzdXJlLCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9idygpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDEiKQoKcmVnX3RlbXBfcmFuayA8LSByZWdfZGZfcmFua1tjKCJleWV0cl9yYW5rIiwgIm1vdHJfcmFuayIpXSAlPiUgZGF0YS5tYXRyaXgoKQpyZWdfdGVtcF9yYW5rX2Ryb3AwcyA8LSByZWdfZGZfcmFua19kcm9wMHNbYygiZXlldHJfcmFuayIsICJtb3RyX3JhbmsiKV0gJT4lIGRhdGEubWF0cml4KCkKCiMgU2V0IHVwIHRoZSBwbG90dGluZyBhcmVhIHdpdGggdHdvIHNpZGUtYnktc2lkZSBwbG90cwpwYXIobWZyb3cgPSBjKDEsIDIpKQojIFBsb3QgdGhlIGZpcnN0IGRhdGEgbWF0cml4IHRkX3RlbXAKcGxvdChyZWdfdGVtcF9yYW5rLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLAogICAgIG1haW4gPSAiRlBSZWcgcmFua2VkIikKcGxvdChyZWdfdGVtcF9yYW5rX2Ryb3AwcywgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwKICAgICBtYWluID0gIkZQUmVnIHJhbmtlZCBkcm9wMHMgIikKCgpgYGAKCmBgYHtyLCBldmFsPUZBTFNFfQpyZWdfcmFua19kYXRhID0gbGlzdCh4PXJlZ190ZW1wX3JhbmssIE49bnJvdyhyZWdfdGVtcF9yYW5rKSkKCmZpdF9yZWdfcmFuayA9IHN0YW4oCiAgZmlsZT0ic3Rhbl9tb2RlbHMvYml2YXJpYXRlX2NvcnJlbGF0aW9uLnN0YW4iLCAKICBkYXRhPXJlZ19yYW5rX2RhdGEsIAogIGl0ZXI9NDAwMCwgCiAgY2hhaW5zPTQsIAogIGNvcmVzPTgsCiAgc2VlZD00NDQsCiAgIyBjb250cm9sPWxpc3QoYWRhcHRfZGVsdGE9MC45OSksIAogIHZlcmJvc2UgPSBGQUxTRQogICkKCiMgU2F2ZSB0aGUgbW9kZWwgCmZpdF9yZWdfcmFua0BzdGFubW9kZWxAZHNvIDwtIG5ldygiY3h4ZHNvIikKc2F2ZVJEUyhmaXRfcmVnX3JhbmssIGZpbGUgPSBwYXN0ZTAoIi4vdGVtcC9yYW5rZWRfbW90cl9leWV0cl9GUFJlZ19jb3IucmRzIikpCgpgYGAKCgoKCgojIGNvcnJlbGF0ZSBleWV0ci1leWV0ciByYW5rZWQgZGF0YQoKYGBge3J9CnByaW50KCJSYW5rIEZpcnN0IFBhc3MgUmVncmVzc2lvbiBQcm9iLiBhbGwgZGF0YSIpCmVyZWdfZGZfcmFuayA9IHByb3ZvX2V5ZXRyX2dyb3VwZWRfZGYgJT4lIGZpbHRlcihtZXRyaWMgPT0gIkZQUmVnIikgJT4lIGRpc3RpbmN0KCkgJT4lICNncm91cF9ieSh0ZXh0X2lkLCBtZXRyaWMsIG1lYXN1cmUpICU+JQogICMgc3VtbWFyaXplKHZhbHVlID0gbWVhbih2YWx1ZSkpICU+JQogIGZpbHRlcighKHJvd19udW1iZXIoKSAlaW4lIGMoNDQzLCA0NDQsIDQ0NSwgNDQ2KSkpICU+JQogICAgc3ByZWFkKG1lYXN1cmUsIHZhbHVlKSAlPiUKICAjIGZpbHRlcihleWV0cl92YWx1ZSA+IDAsIG1vdHJfdmFsdWUgPiAwKSAlPiUKICBtdXRhdGUoZXlldHIxX3JhbmsgPSByYW5rKHZhbHVlXzEsIHRpZXMubWV0aG9kID0gIm1heCIpLAogICAgICAgICBleWV0cjJfcmFuayA9IHJhbmsodmFsdWVfMiwgdGllcy5tZXRob2QgPSAibWF4IikpCgplcmVnX2RmX3JhbmtfZHJvcDBzID0gcHJvdm9fZXlldHJfZ3JvdXBlZF9kZiAlPiUgZmlsdGVyKG1ldHJpYyA9PSAiRlBSZWciKSAlPiUgZGlzdGluY3QoKSAlPiUgI2dyb3VwX2J5KHRleHRfaWQsIG1ldHJpYywgbWVhc3VyZSkgJT4lCiAgIyBzdW1tYXJpemUodmFsdWUgPSBtZWFuKHZhbHVlKSkgJT4lCiAgZmlsdGVyKCEocm93X251bWJlcigpICVpbiUgYyg0NDMsIDQ0NCwgNDQ1LCA0NDYpKSkgJT4lCiAgICBzcHJlYWQobWVhc3VyZSwgdmFsdWUpICU+JQogIGZpbHRlcih2YWx1ZV8xID4gMCwgdmFsdWVfMiA+IDApICU+JQogIG11dGF0ZShleWV0cjFfcmFuayA9IHJhbmsodmFsdWVfMSwgdGllcy5tZXRob2QgPSAibWF4IiksCiAgICAgICAgIGV5ZXRyMl9yYW5rID0gcmFuayh2YWx1ZV8yLCB0aWVzLm1ldGhvZCA9ICJtYXgiKSkKClZpZXcoZXJlZ19kZl9yYW5rKQpwcmludChjb3IudGVzdChlcmVnX2RmX3JhbmskZXlldHIxX3JhbmssIGVyZWdfZGZfcmFuayRleWV0cjJfcmFuaykkZXN0aW1hdGUpCnByaW50KGNvci50ZXN0KGVyZWdfZGZfcmFuayRleWV0cjFfcmFuaywgZXJlZ19kZl9yYW5rJGV5ZXRyMl9yYW5rKSRwLnZhbHVlKQpwcmludChjb3IudGVzdChlcmVnX2RmX3JhbmtfZHJvcDBzJGV5ZXRyMV9yYW5rLCBlcmVnX2RmX3JhbmtfZHJvcDBzJGV5ZXRyMl9yYW5rKSRlc3RpbWF0ZSkKcHJpbnQoY29yLnRlc3QoZXJlZ19kZl9yYW5rX2Ryb3AwcyRleWV0cjFfcmFuaywgZXJlZ19kZl9yYW5rX2Ryb3AwcyRleWV0cjJfcmFuaykkcC52YWx1ZSkKCmVyZWdfZGZfcmFuayAlPiUgCiAgZ2F0aGVyKG1lYXN1cmUsIHZhbHVlLCA3OjgpICU+JQogIGdncGxvdChhZXMoeCA9IHZhbHVlKSkgKwogIGdlb21fZGVuc2l0eSgpICsKICBmYWNldF93cmFwKH5tZWFzdXJlLCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9idygpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDEiKQoKZXJlZ19kZl9yYW5rX2Ryb3AwcyAlPiUgCiAgZ2F0aGVyKG1lYXN1cmUsIHZhbHVlLCA3OjgpICU+JQogIGdncGxvdChhZXMoeCA9IHZhbHVlKSkgKwogIGdlb21fZGVuc2l0eSgpICsKICBmYWNldF93cmFwKH5tZWFzdXJlLCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9idygpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDEiKQoKZXJlZ190ZW1wX3JhbmsgPC0gZXJlZ19kZl9yYW5rW2MoImV5ZXRyMV9yYW5rIiwgImV5ZXRyMl9yYW5rIildICU+JSBkYXRhLm1hdHJpeCgpCmVyZWdfdGVtcF9yYW5rX2Ryb3AwcyA8LSBlcmVnX2RmX3JhbmtfZHJvcDBzW2MoImV5ZXRyMV9yYW5rIiwgImV5ZXRyMl9yYW5rIildICU+JSBkYXRhLm1hdHJpeCgpCgojIFNldCB1cCB0aGUgcGxvdHRpbmcgYXJlYSB3aXRoIHR3byBzaWRlLWJ5LXNpZGUgcGxvdHMKcGFyKG1mcm93ID0gYygxLCAyKSkKIyBQbG90IHRoZSBmaXJzdCBkYXRhIG1hdHJpeCB0ZF90ZW1wCnBsb3QoZXJlZ190ZW1wX3JhbmssIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsCiAgICAgbWFpbiA9ICJGUFJlZyByYW5rZWQiKQpwbG90KGVyZWdfdGVtcF9yYW5rX2Ryb3AwcywgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwKICAgICBtYWluID0gIkZQUmVnIHJhbmtlZCBkcm9wMHMgIikKYGBgCgoKCgoKCgpgYGB7cn0KZml0X21yZWdfYWxsID0gcmVhZFJEUygiLi9tb3RyX2V5ZXRyX0ZQUmVnX2Nvcl9hbGxfZGF0YS5yZHMiKQpmaXRfbXJlZ19hbGxfZHJvcDAgPSByZWFkUkRTKCIuL21vdHJfZXlldHJfRlBSZWdfY29yX2FsbF9kYXRhX2Ryb3Awcy5yZHMiKQpmaXRfbXJlZ19sb3cgPSByZWFkUkRTKCIuL21vdHJfZXlldHJfRlBSZWdfY29yXzAwLTAzLnJkcyIpCmZpdF9tcmVnX2xvd19kcm9wMCA9IHJlYWRSRFMoIi4vbW90cl9leWV0cl9GUFJlZ19jb3JfMDAtMDNfZHJvcDBzLnJkcyIpCmZpdF9tcmVnX2hpZ2ggPSByZWFkUkRTKCIuL21vdHJfZXlldHJfRlBSZWdfY29yXzAzLTEucmRzIikKZml0X21yZWdfaGlnaF9kcm9wMCA9IHJlYWRSRFMoIi4vbW90cl9leWV0cl9GUFJlZ19jb3JfMDMtMV9kcm9wMHMucmRzIikKCmZpdF9yYW5rX2FsbCA9IHJlYWRSRFMoIi4vdGVtcC9yYW5rZWRfbW90cl9leWV0cl9GUFJlZ19jb3IucmRzIikKCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpcnN0IFBhc3MgUmVncmVzc2lvbiBQcm9iLiBhbGwgZGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCnByaW50KGZpdF9tcmVnX2FsbCkKcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmlyc3QgUGFzcyBSZWdyZXNzaW9uIFByb2IuIGFsbCBkYXRhIG5vIDBzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpwcmludChmaXRfbXJlZ19hbGxfZHJvcDApCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpcnN0IFBhc3MgUmVncmVzc2lvbiBQcm9iLjwgMC4zLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpwcmludChmaXRfbXJlZ19sb3cpCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpcnN0IFBhc3MgUmVncmVzc2lvbiBQcm9iLjwgMC4zIG5vIDBzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpwcmludChmaXRfbXJlZ19sb3dfZHJvcDApCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpcnN0IFBhc3MgUmVncmVzc2lvbiBQcm9iLj49IDAuMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKcHJpbnQoZml0X21yZWdfaGlnaCkKcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmlyc3QgUGFzcyBSZWdyZXNzaW9uIFByb2IuPj0gMC4zIG5vIDBzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpwcmludChmaXRfbXJlZ19oaWdoX2Ryb3AwKQoKcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmlyc3QgUGFzcyBSZWdyZXNzaW9uIHJhbmtlZCBhbGwgZGF0YSB3aXRoIDBzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpwcmludChmaXRfcmFua19hbGwpCmBgYAoKYGBge3J9CiMgIyBGUFJlZyBhbGwgZGF0YQojIHN0YW5fdHJhY2UoZml0X21yZWdfYWxsKQojIHN0YW5fZGVucyhmaXRfbXJlZ19hbGwsIHNlcGFyYXRlX2NoYWlucyA9IFRSVUUpCiMgc3Rhbl9wbG90KGZpdF9tcmVnX2FsbCkKCiMgc3Rhbl90cmFjZShmaXRfbXJlZ19hbGxfZHJvcDApCiMgc3Rhbl9kZW5zKGZpdF9tcmVnX2FsbF9kcm9wMCwgc2VwYXJhdGVfY2hhaW5zID0gVFJVRSkKIyBzdGFuX3Bsb3QoZml0X21yZWdfYWxsX2Ryb3AwKQoKIyAjIEZQUmVnIDwgMC4zCiMgc3Rhbl90cmFjZShmaXRfbXJlZ19sb3cpCiMgc3Rhbl9kZW5zKGZpdF9tcmVnX2xvdywgc2VwYXJhdGVfY2hhaW5zID0gVFJVRSkKIyBzdGFuX3Bsb3QoZml0X21yZWdfbG93KQojIAojIHN0YW5fdHJhY2UoZml0X21yZWdfbG93X2Ryb3AwKQojIHN0YW5fZGVucyhmaXRfbXJlZ19sb3dfZHJvcDAsIHNlcGFyYXRlX2NoYWlucyA9IFRSVUUpCiMgc3Rhbl9wbG90KGZpdF9tcmVnX2xvd19kcm9wMCkKCiMgRlBSZWcgPiAwLjMKc3Rhbl90cmFjZShmaXRfbXJlZ19oaWdoKQpzdGFuX2RlbnMoZml0X21yZWdfaGlnaCwgc2VwYXJhdGVfY2hhaW5zID0gVFJVRSkKc3Rhbl9wbG90KGZpdF9tcmVnX2hpZ2gpCgpzdGFuX3RyYWNlKGZpdF9tcmVnX2hpZ2hfZHJvcDApCnN0YW5fZGVucyhmaXRfbXJlZ19oaWdoX2Ryb3AwLCBzZXBhcmF0ZV9jaGFpbnMgPSBUUlVFKQpzdGFuX3Bsb3QoZml0X21yZWdfaGlnaF9kcm9wMCkKYGBgCgpgYGB7cn0KcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmlyc3QgUGFzcyBSZWdyZXNzaW9uIGFsbCBkYXRhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpyaG9fbXJlZ19hbGwgPSBhcy5udW1lcmljKGV4dHJhY3QoZml0X21yZWdfYWxsLCAicmhvIilbWzFdXSkKbWVhbiA9IG1lYW4ocmhvX21yZWdfYWxsKQpjckkgPSBxdWFudGlsZShyaG9fbXJlZ19hbGwsIGMoLjAyNSwgLjk3NSkpCmhwZDk5ID0gSFBEaW50ZXJ2YWwoYXMubWNtYyhyaG9fbXJlZ19hbGwpLCBwcm9iPTAuOTUpCmNhdCgiTWVhbjogIiwgbWVhbiwgIlxuSFBEOiBbIiwgaHBkOTlbLCJsb3dlciJdLCAiLCAiLCBocGQ5OVssInVwcGVyIl0sICJdIiwgc2VwPSIiLCAiXG5jckk6IFsiLCBjcklbMV0sICIsICIsIGNySVsyXSwgIl1cbiIpCgpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaXJzdCBQYXNzIFJlZ3Jlc3Npb24gYWxsIGRhdGEgbm8gMHMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCnJob19tcmVnX2FsbF9kcm9wMCA9IGFzLm51bWVyaWMoZXh0cmFjdChmaXRfbXJlZ19hbGxfZHJvcDAsICJyaG8iKVtbMV1dKQptZWFuID0gbWVhbihyaG9fbXJlZ19hbGxfZHJvcDApCmNySSA9IHF1YW50aWxlKHJob19tcmVnX2FsbF9kcm9wMCwgYyguMDI1LCAuOTc1KSkKaHBkOTkgPSBIUERpbnRlcnZhbChhcy5tY21jKHJob19tcmVnX2FsbF9kcm9wMCksIHByb2I9MC45NSkKY2F0KCJNZWFuOiAiLCBtZWFuLCAiXG5IUEQ6IFsiLCBocGQ5OVssImxvd2VyIl0sICIsICIsIGhwZDk5WywidXBwZXIiXSwgIl0iLCBzZXA9IiIsICJcbmNySTogWyIsIGNySVsxXSwgIiwgIiwgY3JJWzJdLCAiXVxuIikKCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpcnN0IFBhc3MgUmVncmVzc2lvbiA8IDAuMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKcmhvX21yZWdfbG93ID0gYXMubnVtZXJpYyhleHRyYWN0KGZpdF9tcmVnX2xvdywgInJobyIpW1sxXV0pCm1lYW4gPSBtZWFuKHJob19tcmVnX2xvdykKY3JJID0gcXVhbnRpbGUocmhvX21yZWdfbG93LCBjKC4wMjUsIC45NzUpKQpocGQ5OSA9IEhQRGludGVydmFsKGFzLm1jbWMocmhvX21yZWdfbG93KSwgcHJvYj0wLjk1KQpjYXQoIk1lYW46ICIsIG1lYW4sICJcbkhQRDogWyIsIGhwZDk5WywibG93ZXIiXSwgIiwgIiwgaHBkOTlbLCJ1cHBlciJdLCAiXSIsIHNlcD0iIiwgIlxuY3JJOiBbIiwgY3JJWzFdLCAiLCAiLCBjcklbMl0sICJdXG4iKQoKcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmlyc3QgUGFzcyBSZWdyZXNzaW9uIDwgMC4zIG5vIDBzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpyaG9fbXJlZ19sb3dfZHJvcDAgPSBhcy5udW1lcmljKGV4dHJhY3QoZml0X21yZWdfbG93X2Ryb3AwLCAicmhvIilbWzFdXSkKbWVhbiA9IG1lYW4ocmhvX21yZWdfbG93X2Ryb3AwKQpjckkgPSBxdWFudGlsZShyaG9fbXJlZ19sb3dfZHJvcDAsIGMoLjAyNSwgLjk3NSkpCmhwZDk5ID0gSFBEaW50ZXJ2YWwoYXMubWNtYyhyaG9fbXJlZ19sb3dfZHJvcDApLCBwcm9iPTAuOTUpCmNhdCgiTWVhbjogIiwgbWVhbiwgIlxuSFBEOiBbIiwgaHBkOTlbLCJsb3dlciJdLCAiLCAiLCBocGQ5OVssInVwcGVyIl0sICJdIiwgc2VwPSIiLCAiXG5jckk6IFsiLCBjcklbMV0sICIsICIsIGNySVsyXSwgIl1cbiIpCgpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaXJzdCBQYXNzIFJlZ3Jlc3Npb24gPj0gMC4zLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpyaG9fbXJlZ19oaWdoID0gYXMubnVtZXJpYyhleHRyYWN0KGZpdF9tcmVnX2hpZ2gsICJyaG8iKVtbMV1dKQptZWFuID0gbWVhbihyaG9fbXJlZ19oaWdoKQpjckkgPSBxdWFudGlsZShyaG9fbXJlZ19oaWdoLCBjKC4wMjUsIC45NzUpKQpocGQ5OSA9IEhQRGludGVydmFsKGFzLm1jbWMocmhvX21yZWdfaGlnaCksIHByb2I9MC45NSkKY2F0KCJNZWFuOiAiLCBtZWFuLCAiXG5IUEQ6IFsiLCBocGQ5OVssImxvd2VyIl0sICIsICIsIGhwZDk5WywidXBwZXIiXSwgIl0iLCBzZXA9IiIsICJcbmNySTogWyIsIGNySVsxXSwgIiwgIiwgY3JJWzJdLCAiXVxuIikKCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpcnN0IFBhc3MgUmVncmVzc2lvbiA+PSAwLjMgbm8gMHMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCnJob19tcmVnX2hpZ2hfZHJvcDAgPSBhcy5udW1lcmljKGV4dHJhY3QoZml0X21yZWdfaGlnaF9kcm9wMCwgInJobyIpW1sxXV0pCm1lYW4gPSBtZWFuKHJob19tcmVnX2hpZ2hfZHJvcDApCmNySSA9IHF1YW50aWxlKHJob19tcmVnX2hpZ2hfZHJvcDAsIGMoLjAyNSwgLjk3NSkpCmhwZDk5ID0gSFBEaW50ZXJ2YWwoYXMubWNtYyhyaG9fbXJlZ19oaWdoX2Ryb3AwKSwgcHJvYj0wLjk1KQpjYXQoIk1lYW46ICIsIG1lYW4sICJcbkhQRDogWyIsIGhwZDk5WywibG93ZXIiXSwgIiwgIiwgaHBkOTlbLCJ1cHBlciJdLCAiXSIsIHNlcD0iIiwgIlxuY3JJOiBbIiwgY3JJWzFdLCAiLCAiLCBjcklbMl0sICJdXG4iKQoKcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmlyc3QgUGFzcyBSZWdyZXNzaW9uIHJhbmtlZCBhbGwgd2l0aCAwcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKcmhvX21yZWdfZml0X3JhbmtfYWxsID0gYXMubnVtZXJpYyhleHRyYWN0KGZpdF9yYW5rX2FsbCwgInJobyIpW1sxXV0pCm1lYW4gPSBtZWFuKHJob19tcmVnX2ZpdF9yYW5rX2FsbCkKY3JJID0gcXVhbnRpbGUocmhvX21yZWdfZml0X3JhbmtfYWxsLCBjKC4wMjUsIC45NzUpKQpocGQ5OSA9IEhQRGludGVydmFsKGFzLm1jbWMocmhvX21yZWdfZml0X3JhbmtfYWxsKSwgcHJvYj0wLjk1KQpjYXQoIk1lYW46ICIsIG1lYW4sICJcbkhQRDogWyIsIGhwZDk5WywibG93ZXIiXSwgIiwgIiwgaHBkOTlbLCJ1cHBlciJdLCAiXSIsIHNlcD0iIiwgIlxuY3JJOiBbIiwgY3JJWzFdLCAiLCAiLCBjcklbMl0sICJdXG4iKQpgYGAKCmBgYHtyfQpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaXJzdCBQYXNzIFJlZ3Jlc3Npb24gYWxsIGRhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQptYWxscmVnX3JhbmQgPC0gZXh0cmFjdChmaXRfbXJlZ19hbGwsICJ4X3JhbmQiKVtbMV1dCiMgY3JlYXRlIGEgYmxhbmsgcGxvdCBmaXJzdCB3aXRoIGFwcHJvcHJpYXRlIGxpbWl0cwpwbG90KDEsIDEsIHhsaW09YygwLCAxKSwgeWxpbT1jKDAsIDEpLCB0eXBlPSJuIiwKICAgICB4bGFiID0gIkV5ZSB0cmFja2luZyB2YWx1ZSIsIHlsYWIgPSAiTW9UUiB2YWx1ZSIsIG1haW4gPSAiRlBSZWciKSAjICd0eXBlID0gIm4iJyBtYWtlcyBzdXJlIHRoZSBwbG90IGlzIGJsYW5rCgojIGFkZCBwb2ludHMgZm9yIHhfcmFuZCB3aXRoIGNvbG9yCnBvaW50cyhtYWxscmVnX3JhbmRbLDFdLCBtYWxscmVnX3JhbmRbLDJdLCBjb2wgPSAiYmxhY2siLCBwY2ggPSAxNikKIyBhZGQgcG9pbnRzIGZvciBnZF90ZW1wIHdpdGggY29sb3IgcmVkCnBvaW50cyhyZWdfdGVtcF9hbGwsIHBjaD0xNiwgY29sPSJyZWQiKQoKIyBhZGQgZGF0YUVsbGlwc2Ugd2l0aCBjb2xvcgpkYXRhRWxsaXBzZShtYWxscmVnX3JhbmQsIGxldmVscyA9IGMoMC41LCAwLjc1KSwgZmlsbD1ULCBwbG90LnBvaW50cyA9IEYsIGNvbD0ib3JhbmdlIikKZGF0YUVsbGlwc2UobWFsbHJlZ19yYW5kLCBsZXZlbHMgPSBjKDAuOTUsIDAuOTkpLCBmaWxsPVQsIHBsb3QucG9pbnRzID0gRiwgY29sPSJibHVlIikKCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpcnN0IFBhc3MgUmVncmVzc2lvbiBhbGwgZGF0YSBubyAwcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKbWFsbHJlZ19yYW5kX2Ryb3AwIDwtIGV4dHJhY3QoZml0X21yZWdfYWxsX2Ryb3AwLCAieF9yYW5kIilbWzFdXQojIGNyZWF0ZSBhIGJsYW5rIHBsb3QgZmlyc3Qgd2l0aCBhcHByb3ByaWF0ZSBsaW1pdHMKcGxvdCgxLCAxLCB4bGltPWMoMCwgMSksIHlsaW09YygwLCAxKSwgdHlwZT0ibiIsCiAgICAgeGxhYiA9ICJFeWUgdHJhY2tpbmcgdmFsdWUiLCB5bGFiID0gIk1vVFIgdmFsdWUiLCBtYWluID0gIkZQUmVnIikgIyAndHlwZSA9ICJuIicgbWFrZXMgc3VyZSB0aGUgcGxvdCBpcyBibGFuawoKIyBhZGQgcG9pbnRzIGZvciB4X3JhbmQgd2l0aCBjb2xvcgpwb2ludHMobWFsbHJlZ19yYW5kX2Ryb3AwWywxXSwgbWFsbHJlZ19yYW5kX2Ryb3AwWywyXSwgY29sID0gImJsYWNrIiwgcGNoID0gMTYpCiMgYWRkIHBvaW50cyBmb3IgZ2RfdGVtcCB3aXRoIGNvbG9yIHJlZApwb2ludHMocmVnX3RlbXBfYWxsLCBwY2g9MTYsIGNvbD0icmVkIikKCiMgYWRkIGRhdGFFbGxpcHNlIHdpdGggY29sb3IKZGF0YUVsbGlwc2UobWFsbHJlZ19yYW5kX2Ryb3AwLCBsZXZlbHMgPSBjKDAuNSwgMC43NSksIGZpbGw9VCwgcGxvdC5wb2ludHMgPSBGLCBjb2w9Im9yYW5nZSIpCmRhdGFFbGxpcHNlKG1hbGxyZWdfcmFuZF9kcm9wMCwgbGV2ZWxzID0gYygwLjk1LCAwLjk5KSwgZmlsbD1ULCBwbG90LnBvaW50cyA9IEYsIGNvbD0iYmx1ZSIpCgpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaXJzdCBQYXNzIFJlZ3Jlc3Npb24gPCAwLjMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQptbG93cmVnX3JhbmQgPC0gZXh0cmFjdChmaXRfbXJlZ19sb3csICJ4X3JhbmQiKVtbMV1dCiMgcHJpbnQobWxvd3JlZ19yYW5kKQojIGNyZWF0ZSBhIGJsYW5rIHBsb3QgZmlyc3Qgd2l0aCBhcHByb3ByaWF0ZSBsaW1pdHMKcGxvdCgxLCAxLCB4bGltPWMoMCwgMSksIHlsaW09YygwLCAxKSwgdHlwZT0ibiIsCiAgICAgeGxhYiA9ICJFeWUgdHJhY2tpbmcgdmFsdWUiLCB5bGFiID0gIk1vVFIgdmFsdWUiLCBtYWluID0gIkZQUmVnIikgIyAndHlwZSA9ICJuIicgbWFrZXMgc3VyZSB0aGUgcGxvdCBpcyBibGFuawoKIyBhZGQgcG9pbnRzIGZvciB4X3JhbmQgd2l0aCBjb2xvcgpwb2ludHMobWxvd3JlZ19yYW5kWywxXSwgbWxvd3JlZ19yYW5kWywyXSwgY29sID0gImJsYWNrIiwgcGNoID0gMTYpCiMgYWRkIHBvaW50cyBmb3IgZ2RfdGVtcCB3aXRoIGNvbG9yIHJlZApwb2ludHMocmVnX3RlbXBfbG93LCBwY2g9MTYsIGNvbD0icmVkIikKCiMgYWRkIGRhdGFFbGxpcHNlIHdpdGggY29sb3IKZGF0YUVsbGlwc2UobWxvd3JlZ19yYW5kLCBsZXZlbHMgPSBjKDAuNSwgMC43NSksIGZpbGw9VCwgcGxvdC5wb2ludHMgPSBGLCBjb2w9Im9yYW5nZSIpCmRhdGFFbGxpcHNlKG1sb3dyZWdfcmFuZCwgbGV2ZWxzID0gYygwLjk1LCAwLjk5KSwgZmlsbD1ULCBwbG90LnBvaW50cyA9IEYsIGNvbD0iYmx1ZSIpCgpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaXJzdCBQYXNzIFJlZ3Jlc3Npb24gPCAwLjMgbm8gMHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQptbG93cmVnX3JhbmRfZHJvcDAgPC0gZXh0cmFjdChmaXRfbXJlZ19sb3dfZHJvcDAsICJ4X3JhbmQiKVtbMV1dCgojIGNyZWF0ZSBhIGJsYW5rIHBsb3QgZmlyc3Qgd2l0aCBhcHByb3ByaWF0ZSBsaW1pdHMKcGxvdCgxLCAxLCB4bGltPWMoMCwgMSksIHlsaW09YygwLCAxKSwgdHlwZT0ibiIsCiAgICAgeGxhYiA9ICJFeWUgdHJhY2tpbmcgdmFsdWUiLCB5bGFiID0gIk1vVFIgdmFsdWUiLCBtYWluID0gIkZQUmVnIikgIyAndHlwZSA9ICJuIicgbWFrZXMgc3VyZSB0aGUgcGxvdCBpcyBibGFuawoKIyBhZGQgcG9pbnRzIGZvciB4X3JhbmQgd2l0aCBjb2xvcgpwb2ludHMobWxvd3JlZ19yYW5kX2Ryb3AwWywxXSwgbWxvd3JlZ19yYW5kX2Ryb3AwWywyXSwgY29sID0gImJsYWNrIiwgcGNoID0gMTYpCiMgYWRkIHBvaW50cyBmb3IgZ2RfdGVtcCB3aXRoIGNvbG9yIHJlZApwb2ludHMocmVnX3RlbXBfbG93X2Ryb3AwLCBwY2g9MTYsIGNvbD0icmVkIikKCiMgYWRkIGRhdGFFbGxpcHNlIHdpdGggY29sb3IKZGF0YUVsbGlwc2UobWxvd3JlZ19yYW5kX2Ryb3AwLCBsZXZlbHMgPSBjKDAuNSwgMC43NSksIGZpbGw9VCwgcGxvdC5wb2ludHMgPSBGLCBjb2w9Im9yYW5nZSIpCmRhdGFFbGxpcHNlKG1sb3dyZWdfcmFuZF9kcm9wMCwgbGV2ZWxzID0gYygwLjk1LCAwLjk5KSwgZmlsbD1ULCBwbG90LnBvaW50cyA9IEYsIGNvbD0iYmx1ZSIpCgpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaXJzdCBQYXNzIFJlZ3Jlc3Npb24gPj0gMC4zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKbWhpZ2hyZWdfcmFuZF9zYW1wbGVzIDwtIGV4dHJhY3QoZml0X21yZWdfaGlnaCwgInhfcmFuZCIpW1sxXV0KIyBwcmludChtaGlnaHJlZ19yYW5kX3NhbXBsZXMpCnNlbGVjdGVkX2luZGljZXMgPC0gc2FtcGxlKDE6bnJvdyhtaGlnaHJlZ19yYW5kX3NhbXBsZXMpLCA5MDApCm1oaWdocmVnX3JhbmQgPC0gbWhpZ2hyZWdfcmFuZF9zYW1wbGVzW3NlbGVjdGVkX2luZGljZXMsIF0KIyBtaGlnaHJlZ19yYW5kIDwtIGV4dHJhY3QoZml0X21yZWdfaGlnaCwgInhfcmFuZCIpW1sxXV0KIyBjcmVhdGUgYSBibGFuayBwbG90IGZpcnN0IHdpdGggYXBwcm9wcmlhdGUgbGltaXRzCnBsb3QoMSwgMSwgeGxpbT1jKDAsIDEpLCB5bGltPWMoMCwgMSksIHR5cGU9Im4iLAogICAgIHhsYWIgPSAiRXllIHRyYWNraW5nIHZhbHVlIiwgeWxhYiA9ICJNb1RSIHZhbHVlIiwgbWFpbiA9ICJGUFJlZyIpICMgJ3R5cGUgPSAibiInIG1ha2VzIHN1cmUgdGhlIHBsb3QgaXMgYmxhbmsKCiMgYWRkIHBvaW50cyBmb3IgeF9yYW5kIHdpdGggY29sb3IKcG9pbnRzKG1oaWdocmVnX3JhbmRbLDFdLCBtaGlnaHJlZ19yYW5kWywyXSwgY29sID0gImJsYWNrIiwgcGNoID0gMTYpCiMgYWRkIHBvaW50cyBmb3IgZ2RfdGVtcCB3aXRoIGNvbG9yIHJlZApwb2ludHMocmVnX3RlbXBfaGlnaCwgcGNoPTE2LCBjb2w9InJlZCIpCgojIGFkZCBkYXRhRWxsaXBzZSB3aXRoIGNvbG9yCmRhdGFFbGxpcHNlKG1oaWdocmVnX3JhbmQsIGxldmVscyA9IGMoMC41LCAwLjc1KSwgZmlsbD1ULCBwbG90LnBvaW50cyA9IEYsIGNvbD0ib3JhbmdlIikKZGF0YUVsbGlwc2UobWhpZ2hyZWdfcmFuZCwgbGV2ZWxzID0gYygwLjk1LCAwLjk5KSwgZmlsbD1ULCBwbG90LnBvaW50cyA9IEYsIGNvbD0iYmx1ZSIpCgpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaXJzdCBQYXNzIFJlZ3Jlc3Npb24gPj0gMC4zIG5vIDBzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKbWhpZ2hyZWdfcmFuZF9kcm9wMF9zYW1wbGVzIDwtIGV4dHJhY3QoZml0X21yZWdfaGlnaF9kcm9wMCwgInhfcmFuZCIpW1sxXV0Kc2VsZWN0ZWRfaW5kaWNlcyA8LSBzYW1wbGUoMTpucm93KG1oaWdocmVnX3JhbmRfZHJvcDBfc2FtcGxlcyksIDkwMCkKbWhpZ2hyZWdfcmFuZF9kcm9wMCA8LSBtaGlnaHJlZ19yYW5kX2Ryb3AwX3NhbXBsZXNbc2VsZWN0ZWRfaW5kaWNlcywgXQoKIyBjcmVhdGUgYSBibGFuayBwbG90IGZpcnN0IHdpdGggYXBwcm9wcmlhdGUgbGltaXRzCnBsb3QoMSwgMSwgeGxpbT1jKDAsIDEpLCB5bGltPWMoMCwgMSksIHR5cGU9Im4iLAogICAgIHhsYWIgPSAiRXllIHRyYWNraW5nIHZhbHVlIiwgeWxhYiA9ICJNb1RSIHZhbHVlIiwgbWFpbiA9ICJGUFJlZyIpICMgJ3R5cGUgPSAibiInIG1ha2VzIHN1cmUgdGhlIHBsb3QgaXMgYmxhbmsKCiMgYWRkIHBvaW50cyBmb3IgeF9yYW5kIHdpdGggY29sb3IKcG9pbnRzKG1oaWdocmVnX3JhbmRfZHJvcDBbLDFdLCBtaGlnaHJlZ19yYW5kX2Ryb3AwWywyXSwgY29sID0gImJsYWNrIiwgcGNoID0gMTYpCiMgYWRkIHBvaW50cyBmb3IgZ2RfdGVtcCB3aXRoIGNvbG9yIHJlZApwb2ludHMocmVnX3RlbXBfaGlnaF9kcm9wMCwgcGNoPTE2LCBjb2w9InJlZCIpCgojIGFkZCBkYXRhRWxsaXBzZSB3aXRoIGNvbG9yCmRhdGFFbGxpcHNlKG1oaWdocmVnX3JhbmRfZHJvcDAsIGxldmVscyA9IGMoMC41LCAwLjc1KSwgZmlsbD1ULCBwbG90LnBvaW50cyA9IEYsIGNvbD0ib3JhbmdlIikKZGF0YUVsbGlwc2UobWhpZ2hyZWdfcmFuZF9kcm9wMCwgbGV2ZWxzID0gYygwLjk1LCAwLjk5KSwgZmlsbD1ULCBwbG90LnBvaW50cyA9IEYsIGNvbD0iYmx1ZSIpCgpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaXJzdCBQYXNzIFJlZ3Jlc3Npb24gcmFua2VkIGFsbCBkYXRhIHdpdGggMHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQptcmFua3JlZ19yYW5kX3NhbXBsZXMgPC0gZXh0cmFjdChmaXRfcmFua19hbGwsICJ4X3JhbmQiKVtbMV1dCnNlbGVjdGVkX2luZGljZXMgPC0gc2FtcGxlKDE6bnJvdyhtcmFua3JlZ19yYW5kX3NhbXBsZXMpLCA5MDApCm1yYW5rcmVnX3JhbmQgPC0gbXJhbmtyZWdfcmFuZF9zYW1wbGVzW3NlbGVjdGVkX2luZGljZXMsIF0KCiMgY3JlYXRlIGEgYmxhbmsgcGxvdCBmaXJzdCB3aXRoIGFwcHJvcHJpYXRlIGxpbWl0cwpwbG90KDEsIDEsIHhsaW09YygwLCAzNTAwKSwgeWxpbT1jKDAsIDM1MDApLCB0eXBlPSJuIiwKICAgICB4bGFiID0gIkV5ZSB0cmFja2luZyB2YWx1ZSIsIHlsYWIgPSAiTW9UUiB2YWx1ZSIsIG1haW4gPSAiRlBSZWciKSAjICd0eXBlID0gIm4iJyBtYWtlcyBzdXJlIHRoZSBwbG90IGlzIGJsYW5rCgojIGFkZCBwb2ludHMgZm9yIHhfcmFuZCB3aXRoIGNvbG9yCnBvaW50cyhtcmFua3JlZ19yYW5kWywxXSwgbXJhbmtyZWdfcmFuZFssMl0sIGNvbCA9ICJibGFjayIsIHBjaCA9IDE2KQojIGFkZCBwb2ludHMgZm9yIGdkX3RlbXAgd2l0aCBjb2xvciByZWQKcG9pbnRzKHJlZ190ZW1wX3JhbmssIHBjaD0xNiwgY29sPSJyZWQiKQoKIyBhZGQgZGF0YUVsbGlwc2Ugd2l0aCBjb2xvcgpkYXRhRWxsaXBzZShtcmFua3JlZ19yYW5kLCBsZXZlbHMgPSBjKDAuNSwgMC43NSksIGZpbGw9VCwgcGxvdC5wb2ludHMgPSBGLCBjb2w9Im9yYW5nZSIpCmRhdGFFbGxpcHNlKG1yYW5rcmVnX3JhbmQsIGxldmVscyA9IGMoMC45NSwgMC45OSksIGZpbGw9VCwgcGxvdC5wb2ludHMgPSBGLCBjb2w9ImJsdWUiKQoKYGBgCgoKCgoKCiMgbW9kZWwgZXllIHRyYWNraW5nIHRvIGV5ZSB0cmFja2luZyBjb3JyZWxhdGlvbgpgYGB7cn0KCnByaW50KCJHYXplIER1cmF0aW9uIikKIyBWaWV3KHByb3ZvX2V5ZXRyX2dyb3VwZWRfZGYpCgplZ2RfZGYgPSBwcm92b19leWV0cl9ncm91cGVkX2RmICU+JSBmaWx0ZXIobWV0cmljID09ICJnYXplX2R1cmF0aW9uIikgJT4lICNncm91cF9ieSh0ZXh0X2lkLCBtZXRyaWMsIG1lYXN1cmUpICU+JQogICMgc3VtbWFyaXplKHZhbHVlID0gbWVhbih2YWx1ZSwgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lCiAgICBzcHJlYWQobWVhc3VyZSwgdmFsdWUpICU+JQogICMgc21vb3RoaW5nLCBpZiBpbmNsdWRlcyAwcwogIG11dGF0ZShleWV0cl92YWx1ZV8xID0gIHBtYXgodmFsdWVfMSwgMSksCiAgICAgICAgIGV5ZXRyX3ZhbHVlXzIgPSBwbWF4KHZhbHVlXzIsIDEpCiAgKSAKcHJpbnQoY29yLnRlc3QoZWdkX2RmJGV5ZXRyX3ZhbHVlXzEsIGVnZF9kZiRleWV0cl92YWx1ZV8yKSRlc3RpbWF0ZSkKCiMgVmlldyhlZ2RfZGYpCgplZ2RfZGYgJT4lIAogIGdhdGhlcihtZWFzdXJlLCB2YWx1ZSwgNTo2KSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB2YWx1ZSkpICsKICBnZW9tX2RlbnNpdHkoKSArCiAgZmFjZXRfd3JhcCh+bWVhc3VyZSwgc2NhbGVzID0gImZyZWUiKSArCiAgdGhlbWVfYncoKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQxIikKCmVnZF90ZW1wIDwtIGVnZF9kZltjKCJleWV0cl92YWx1ZV8xIiwgImV5ZXRyX3ZhbHVlXzIiKV0gJT4lCiAgZGF0YS5tYXRyaXgoKQoKIyBTZXQgdXAgdGhlIHBsb3R0aW5nIGFyZWEgd2l0aCB0d28gc2lkZS1ieS1zaWRlIHBsb3RzCnBhcihtZnJvdyA9IGMoMSwgMikpCiMgUGxvdCB0aGUgZmlyc3QgZGF0YSBtYXRyaXggZ2RfdGVtcApwbG90KGVnZF90ZW1wLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLAogICAgIG1haW4gPSAiTm90IExvZy1UcmFuc2Zvcm1lZCIpCgpgYGAKCmBgYHtyLCBldmFsPUZBTFNFfQplZ2RfZGF0YSA9IGxpc3QoeD1lZ2RfdGVtcCwgTj1ucm93KGVnZF90ZW1wKSkKCmZpdF9lZ2QgPSBzdGFuKAogIGZpbGU9InN0YW5fbW9kZWxzL2JpdmFyaWF0ZV9jb3JyZWxhdGlvbi5zdGFuIiwgCiAgZGF0YT1lZ2RfZGF0YSwgCiAgaXRlcj00MDAwLCAKICBjaGFpbnM9NCwgCiAgY29yZXM9OCwKICBzZWVkPTQ0NCwKICAjIGNvbnRyb2w9bGlzdChhZGFwdF9kZWx0YT0wLjk5KSwgCiAgdmVyYm9zZSA9IEZBTFNFCiAgKQoKIyBTYXZlIHRoZSBtb2RlbCAKZml0X2VnZEBzdGFubW9kZWxAZHNvIDwtIG5ldygiY3h4ZHNvIikKc2F2ZVJEUyhmaXRfZWdkLCBmaWxlID0gcGFzdGUwKCJleWV0cl9leWV0cl9nYXplX2R1cmF0aW9uX2Nvci5yZHMiKSkKCmBgYAoKYGBge3J9CnByaW50KCJHbyBQYXN0IFRpbWUiKQoKZWdwdF9kZiA9IHByb3ZvX2V5ZXRyX2dyb3VwZWRfZGYgJT4lIGZpbHRlcihtZXRyaWMgPT0gImdvX3Bhc3RfdGltZSIpICU+JSAjZ3JvdXBfYnkodGV4dF9pZCwgbWV0cmljLCBtZWFzdXJlKSAlPiUKICAjIHN1bW1hcml6ZSh2YWx1ZSA9IG1lYW4odmFsdWUsIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAnZHJvcCcpICU+JQogICAgc3ByZWFkKG1lYXN1cmUsIHZhbHVlKSAlPiUKICAjIHNtb290aGluZywgaWYgaW5jbHVkZXMgMHMKICBtdXRhdGUoZXlldHJfdmFsdWVfMSA9ICBwbWF4KHZhbHVlXzEsIDEpLAogICAgICAgICBleWV0cl92YWx1ZV8yID0gcG1heCh2YWx1ZV8yLCAxKQogICkgCnByaW50KGNvci50ZXN0KGVncHRfZGYkZXlldHJfdmFsdWVfMSwgZWdwdF9kZiRleWV0cl92YWx1ZV8yKSRlc3RpbWF0ZSkKCiMgVmlldyhlZ2RfZGYpCgplZ3B0X2RmICU+JSAKICBnYXRoZXIobWVhc3VyZSwgdmFsdWUsIDU6NikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdmFsdWUpKSArCiAgZ2VvbV9kZW5zaXR5KCkgKwogIGZhY2V0X3dyYXAofm1lYXN1cmUsIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpCgplZ3B0X3RlbXAgPC0gZWdwdF9kZltjKCJleWV0cl92YWx1ZV8xIiwgImV5ZXRyX3ZhbHVlXzIiKV0gJT4lCiAgZGF0YS5tYXRyaXgoKQoKIyBTZXQgdXAgdGhlIHBsb3R0aW5nIGFyZWEgd2l0aCB0d28gc2lkZS1ieS1zaWRlIHBsb3RzCnBhcihtZnJvdyA9IGMoMSwgMikpCiMgUGxvdCB0aGUgZmlyc3QgZGF0YSBtYXRyaXggZ2RfdGVtcApwbG90KGVncHRfdGVtcCwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwKICAgICBtYWluID0gIk5vdCBMb2ctVHJhbnNmb3JtZWQiKQpgYGAKCmBgYHtyLCBldmFsPUZBTFNFfQplZ3B0X2RhdGEgPSBsaXN0KHg9ZWdwdF90ZW1wLCBOPW5yb3coZWdwdF90ZW1wKSkKCmZpdF9lZ3B0ID0gc3RhbigKICBmaWxlPSJzdGFuX21vZGVscy9iaXZhcmlhdGVfY29ycmVsYXRpb24uc3RhbiIsIAogIGRhdGE9ZWdwdF9kYXRhLCAKICBpdGVyPTQwMDAsIAogIGNoYWlucz00LCAKICBjb3Jlcz04LAogIHNlZWQ9NDQ0LAogICMgY29udHJvbD1saXN0KGFkYXB0X2RlbHRhPTAuOTkpLCAKICB2ZXJib3NlID0gRkFMU0UKICApCgojIFNhdmUgdGhlIG1vZGVsIApmaXRfZWdwdEBzdGFubW9kZWxAZHNvIDwtIG5ldygiY3h4ZHNvIikKc2F2ZVJEUyhmaXRfZWdwdCwgZmlsZSA9IHBhc3RlMCgiZXlldHJfZXlldHJfZ29fcGFzdF90aW1lX2Nvci5yZHMiKSkKCmBgYAoKYGBge3J9CnByaW50KCJUb3RhbCBEdXJhdGlvbiIpCgpldGRfZGYgPSBwcm92b19leWV0cl9ncm91cGVkX2RmICU+JSBmaWx0ZXIobWV0cmljID09ICJ0b3RhbF9kdXJhdGlvbiIpICU+JSAjZ3JvdXBfYnkodGV4dF9pZCwgbWV0cmljLCBtZWFzdXJlKSAlPiUKICAjIHN1bW1hcml6ZSh2YWx1ZSA9IG1lYW4odmFsdWUsIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAnZHJvcCcpICU+JQogICAgc3ByZWFkKG1lYXN1cmUsIHZhbHVlKSAlPiUKICAjIHNtb290aGluZywgaWYgaW5jbHVkZXMgMHMKICBtdXRhdGUoZXlldHJfdmFsdWVfMSA9ICBwbWF4KHZhbHVlXzEsIDEpLAogICAgICAgICBleWV0cl92YWx1ZV8yID0gcG1heCh2YWx1ZV8yLCAxKQogICkgCnByaW50KGNvci50ZXN0KGV0ZF9kZiRleWV0cl92YWx1ZV8xLCBldGRfZGYkZXlldHJfdmFsdWVfMikkZXN0aW1hdGUpCgojIFZpZXcoZWdkX2RmKQoKZXRkX2RmICU+JSAKICBnYXRoZXIobWVhc3VyZSwgdmFsdWUsIDU6NikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdmFsdWUpKSArCiAgZ2VvbV9kZW5zaXR5KCkgKwogIGZhY2V0X3dyYXAofm1lYXN1cmUsIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpCgpldGRfdGVtcCA8LSBldGRfZGZbYygiZXlldHJfdmFsdWVfMSIsICJleWV0cl92YWx1ZV8yIildICU+JQogIGRhdGEubWF0cml4KCkKCiMgU2V0IHVwIHRoZSBwbG90dGluZyBhcmVhIHdpdGggdHdvIHNpZGUtYnktc2lkZSBwbG90cwpwYXIobWZyb3cgPSBjKDEsIDIpKQojIFBsb3QgdGhlIGZpcnN0IGRhdGEgbWF0cml4IGdkX3RlbXAKcGxvdChldGRfdGVtcCwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwKICAgICBtYWluID0gIlRvdGFsIER1cmF0aW9uIE5vdCBMb2ctVHJhbnNmb3JtZWQiKQpgYGAKCmBgYHtyLCBldmFsPUZBTFNFfQpldGRfZGF0YSA9IGxpc3QoeD1ldGRfdGVtcCwgTj1ucm93KGV0ZF90ZW1wKSkKCmZpdF9ldGQgPSBzdGFuKAogIGZpbGU9InN0YW5fbW9kZWxzL2JpdmFyaWF0ZV9jb3JyZWxhdGlvbi5zdGFuIiwgCiAgZGF0YT1ldGRfZGF0YSwgCiAgaXRlcj00MDAwLCAKICBjaGFpbnM9NCwgCiAgY29yZXM9OCwKICBzZWVkPTQ0NCwKICAjIGNvbnRyb2w9bGlzdChhZGFwdF9kZWx0YT0wLjk5KSwgCiAgIyB2ZXJib3NlID0gRkFMU0UKICApCgojIFNhdmUgdGhlIG1vZGVsIApmaXRfZXRkQHN0YW5tb2RlbEBkc28gPC0gbmV3KCJjeHhkc28iKQpzYXZlUkRTKGZpdF9ldGQsIGZpbGUgPSBwYXN0ZTAoImV5ZXRyX2V5ZXRyX3RvdGFsX2R1cmF0aW9uX2Nvci5yZHMiKSkKYGBgCgpgYGB7cn0KcHJpbnQoIkZpc3J0IFBhc3MgUmVncmVzc2lvbiBQcm9iLiIpCgplcmVnX2RmID0gcHJvdm9fZXlldHJfZ3JvdXBlZF9kZiAlPiUgZmlsdGVyKG1ldHJpYyA9PSAiRlBSZWciKSAlPiUgZGlzdGluY3QoKSAlPiUgI2dyb3VwX2J5KHRleHRfaWQsIG1ldHJpYywgbWVhc3VyZSkgJT4lCiAgIyBzdW1tYXJpemUodmFsdWUgPSBtZWFuKHZhbHVlKSkgJT4lCiAgZmlsdGVyKCEocm93X251bWJlcigpICVpbiUgYyg0NDMsIDQ0NCwgNDQ1LCA0NDYpKSkgJT4lCiAgICBzcHJlYWQobWVhc3VyZSwgdmFsdWUpICU+JQogICMgc21vb3RoaW5nLCBpZiBpbmNsdWRlcyAwcwogIG11dGF0ZShleWV0cl92YWx1ZV8xID0gIHBtYXgodmFsdWVfMSwgMWUtNSksCiAgICAgICAgIGV5ZXRyX3ZhbHVlXzIgPSBwbWF4KHZhbHVlXzIsIDFlLTUpCiAgKQpwcmludChjb3IudGVzdChlcmVnX2RmJGV5ZXRyX3ZhbHVlXzEsIGVyZWdfZGYkZXlldHJfdmFsdWVfMikkZXN0aW1hdGUpCgojIFZpZXcoZWdkX2RmKQoKZXJlZ19kZiAlPiUgCiAgZ2F0aGVyKG1lYXN1cmUsIHZhbHVlLCA1OjYpICU+JQogIGdncGxvdChhZXMoeCA9IHZhbHVlKSkgKwogIGdlb21fZGVuc2l0eSgpICsKICBmYWNldF93cmFwKH5tZWFzdXJlLCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9idygpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDEiKQoKZXJlZ190ZW1wIDwtIGVyZWdfZGZbYygiZXlldHJfdmFsdWVfMSIsICJleWV0cl92YWx1ZV8yIildICU+JQogIGRyb3BfbmEoKSAlPiUKICBkYXRhLm1hdHJpeCgpCgojIFNldCB1cCB0aGUgcGxvdHRpbmcgYXJlYSB3aXRoIHR3byBzaWRlLWJ5LXNpZGUgcGxvdHMKcGFyKG1mcm93ID0gYygxLCAyKSkKIyBQbG90IHRoZSBmaXJzdCBkYXRhIG1hdHJpeCBnZF90ZW1wCnBsb3QoZXJlZ190ZW1wLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLAogICAgIG1haW4gPSAiRlBSZWcgTm90IExvZy1UcmFuc2Zvcm1lZCIpCmBgYAoKYGBge3IsIGV2YWw9RkFMU0V9CiMgLS0tLS0tLWZpdCBtb2RlbCBGUFJlZyAtLS0tLS0tLS0tCgojIFZpZXcoZXJlZ190ZW1wKQplcmVnX2RhdGEgPSBsaXN0KHg9ZXJlZ190ZW1wLCBOPW5yb3coZXJlZ190ZW1wKSkKZml0X2VyZWcgPSBzdGFuKAogIGZpbGU9InN0YW5fbW9kZWxzL2JpdmFyaWF0ZV9ub3JtYWxfcmVnLnN0YW4iLCAKICBkYXRhPWVyZWdfZGF0YSwgCiAgaXRlcj00MDAwLCAKICBjaGFpbnM9NCwgCiAgY29yZXM9OCwKICBzZWVkPTQ0NCwKICAjIGNvbnRyb2w9bGlzdChhZGFwdF9kZWx0YT0wLjk5KSwKICB2ZXJib3NlID0gRkFMU0UKICApCgojIFNhdmUgdGhlIG1vZGVsIApmaXRfZXJlZ0BzdGFubW9kZWxAZHNvIDwtIG5ldygiY3h4ZHNvIikKc2F2ZVJEUyhmaXRfZXJlZywgZmlsZSA9IHBhc3RlMCgiZXlldHJfZXlldHJfRlBSZWdfY29yNS5yZHMiKSkKYGBgCgoKCgoKYGBge3J9CmZpdF9lZ2QgPSByZWFkUkRTKCIuL2V5ZXRyX2V5ZXRyX2dhemVfZHVyYXRpb25fY29yLnJkcyIpCmZpdF9lZ3B0ID0gcmVhZFJEUygiLi9leWV0cl9leWV0cl9nb19wYXN0X3RpbWVfY29yLnJkcyIpCmZpdF9ldGQgPSByZWFkUkRTKCIuL2V5ZXRyX2V5ZXRyX3RvdGFsX2R1cmF0aW9uX2Nvci5yZHMiKQpmaXRfZXJlZyA9IHJlYWRSRFMoIi4vZXlldHJfZXlldHJfRlBSZWdfY29yLnJkcyIpCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdhemUgRHVyYXRpb24tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCnByaW50KGZpdF9lZ2QpCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdvIFBhc3QgVGltZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKcHJpbnQoZml0X2VncHQpCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRvdGFsIER1cmF0aW9uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpwcmludChmaXRfZXRkKQpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaXJzdCBQYXNzIFJlZ3Jlc3Npb24gUHJvYi4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCnByaW50KGZpdF9lcmVnKQpgYGAKCgpgYGB7ciwgZXZhbD1GQUxTRX0KIyBzdGFuX3RyYWNlKGZpdF9lZ2QsIHBhcnM9YygicmhvIiwgIm11IiwgInNpZ21hIiwgIm51IikpCiMgc3Rhbl9kZW5zKGZpdF9lZ2QsIHBhcnM9YygicmhvIiwgIm11IiwgInNpZ21hIiwgIm51IiksIHNlcGFyYXRlX2NoYWlucyA9IFRSVUUpCiMgc3Rhbl9wbG90KGZpdF9lZ2QsIHBhcnM9YygicmhvIiwgIm11IiwgInNpZ21hIiwgIm51IikpCgojIEdhemUgRHVyYXRpb24Kc3Rhbl90cmFjZShmaXRfZWdkKQpzdGFuX2RlbnMoZml0X2VnZCwgc2VwYXJhdGVfY2hhaW5zID0gVFJVRSkKc3Rhbl9wbG90KGZpdF9lZ2QpCgojIEdvIFBhc3QgVGltZQpzdGFuX3RyYWNlKGZpdF9lZ3B0KQpzdGFuX2RlbnMoZml0X2VncHQsIHNlcGFyYXRlX2NoYWlucyA9IFRSVUUpCnN0YW5fcGxvdChmaXRfZWdwdCkKCiMgVG90YWwgRHVyYXRpb24Kc3Rhbl90cmFjZShmaXRfZXRkKQpzdGFuX2RlbnMoZml0X2V0ZCwgc2VwYXJhdGVfY2hhaW5zID0gVFJVRSkKc3Rhbl9wbG90KGZpdF9ldGQpCgojIEZQUmVnCnN0YW5fdHJhY2UoZml0X2VyZWcpCnN0YW5fZGVucyhmaXRfZXJlZywgc2VwYXJhdGVfY2hhaW5zID0gVFJVRSkKc3Rhbl9wbG90KGZpdF9lcmVnKQpgYGAKCgpgYGB7cn0KcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2F6ZSBEdXJhdGlvbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKcmhvX2VnZCA9IGFzLm51bWVyaWMoZXh0cmFjdChmaXRfZWdkLCAicmhvIilbWzFdXSkKbWVhbiA9IG1lYW4ocmhvX2VnZCkKY3JJID0gcXVhbnRpbGUocmhvX2VnZCwgYyguMDI1LCAuOTc1KSkKaHBkOTkgPSBIUERpbnRlcnZhbChhcy5tY21jKHJob19lZ2QpLCBwcm9iPTAuOTUpCmNhdCgiTWVhbjogIiwgbWVhbiwgIlxuSFBEOiBbIiwgaHBkOTlbLCJsb3dlciJdLCAiLCAiLCBocGQ5OVssInVwcGVyIl0sICJdIiwgc2VwPSIiLCAiXG5jckk6IFsiLCBjcklbMV0sICIsICIsIGNySVsyXSwgIl1cbiIpCgpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbyBQYXN0IFRpbWUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCnJob19lZ3B0ID0gYXMubnVtZXJpYyhleHRyYWN0KGZpdF9lZ3B0LCAicmhvIilbWzFdXSkKbWVhbiA9IG1lYW4ocmhvX2VncHQpCmNySSA9IHF1YW50aWxlKHJob19lZ3B0LCBjKC4wMjUsIC45NzUpKQpocGQ5OSA9IEhQRGludGVydmFsKGFzLm1jbWMocmhvX2VncHQpLCBwcm9iPTAuOTUpCmNhdCgiTWVhbjogIiwgbWVhbiwgIlxuSFBEOiBbIiwgaHBkOTlbLCJsb3dlciJdLCAiLCAiLCBocGQ5OVssInVwcGVyIl0sICJdIiwgc2VwPSIiLCAiXG5jckk6IFsiLCBjcklbMV0sICIsICIsIGNySVsyXSwgIl1cbiIpCgpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUb3RhbCBEdXJhdGlvbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKcmhvX2V0ZCA9IGFzLm51bWVyaWMoZXh0cmFjdChmaXRfZXRkLCAicmhvIilbWzFdXSkKbWVhbiA9IG1lYW4ocmhvX2V0ZCkKY3JJID0gcXVhbnRpbGUocmhvX2V0ZCwgYyguMDI1LCAuOTc1KSkKaHBkOTkgPSBIUERpbnRlcnZhbChhcy5tY21jKHJob19ldGQpLCBwcm9iPTAuOTUpCmNhdCgiTWVhbjogIiwgbWVhbiwgIlxuSFBEOiBbIiwgaHBkOTlbLCJsb3dlciJdLCAiLCAiLCBocGQ5OVssInVwcGVyIl0sICJdIiwgc2VwPSIiLCAiXG5jckk6IFsiLCBjcklbMV0sICIsICIsIGNySVsyXSwgIl1cbiIpCgpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaXJzdCBQYXNzIFJlZ3Jlc3Npb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpyaG9fZXJlZyA9IGFzLm51bWVyaWMoZXh0cmFjdChmaXRfZXJlZywgInJobyIpW1sxXV0pCm1lYW4gPSBtZWFuKHJob19lcmVnKQpjckkgPSBxdWFudGlsZShyaG9fZXJlZywgYyguMDI1LCAuOTc1KSkKaHBkOTkgPSBIUERpbnRlcnZhbChhcy5tY21jKHJob19lcmVnKSwgcHJvYj0wLjk1KQpjYXQoIk1lYW46ICIsIG1lYW4sICJcbkhQRDogWyIsIGhwZDk5WywibG93ZXIiXSwgIiwgIiwgaHBkOTlbLCJ1cHBlciJdLCAiXSIsIHNlcD0iIiwgIlxuY3JJOiBbIiwgY3JJWzFdLCAiLCAiLCBjcklbMl0sICJdIikKYGBgCgoKYGBge3J9CnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdhemUgRHVyYXRpb24tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCmVnZF9yYW5kIDwtIGV4dHJhY3QoZml0X2VnZCwgInhfcmFuZCIpW1sxXV0KIyB4X3JhbmRfZmlsdGVyZWQgPC0geF9yYW5kW2FwcGx5KHhfcmFuZCwgMSwgZnVuY3Rpb24oeCkgYWxsKHggPiAwKSksXQojIHhfcmFuZF9maWx0ZXJlZAoKIyBjcmVhdGUgYSBibGFuayBwbG90IGZpcnN0IHdpdGggYXBwcm9wcmlhdGUgbGltaXRzCnBsb3QoMSwgMSwgeGxpbT1jKDAsIDQwMCksIHlsaW09YygwLCA3MDApLCB0eXBlPSJuIiwKICAgICB4bGFiID0gIkV5ZSB0cmFja2luZyB2YWx1ZSAxIiwgeWxhYiA9ICJFeWUgdHJhY2tpbmcgdmFsdWUgMiIsIG1haW4gPSAiR2F6ZSBEdXJhdGlvbiIpICMgJ3R5cGUgPSAibiInIG1ha2VzIHN1cmUgdGhlIHBsb3QgaXMgYmxhbmsKCiMgYWRkIHBvaW50cyBmb3IgeF9yYW5kIHdpdGggY29sb3IgCnBvaW50cyhlZ2RfcmFuZFssMV0sIGVnZF9yYW5kWywyXSwgY29sID0gImJsYWNrIiwgcGNoID0gMTYpCiMgYWRkIHBvaW50cyBmb3IgZ2RfdGVtcCB3aXRoIGNvbG9yIHJlZApwb2ludHMoZWdkX3RlbXAsIHBjaD0xNiwgY29sPSJyZWQiKQoKIyBhZGQgZGF0YUVsbGlwc2Ugd2l0aCBjb2xvciAKZGF0YUVsbGlwc2UoZWdkX3JhbmQsIGxldmVscyA9IGMoMC41LCAwLjc1KSwgZmlsbD1ULCBwbG90LnBvaW50cyA9IEYsIGNvbD0ib3JhbmdlIikKZGF0YUVsbGlwc2UoZWdkX3JhbmQsIGxldmVscyA9IGMoMC45NSwgMC45OSksIGZpbGw9VCwgcGxvdC5wb2ludHMgPSBGLCBjb2w9ImJsdWUiKQoKcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR28gUGFzdCBUaW1lLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQplZ3B0X3JhbmQgPC0gZXh0cmFjdChmaXRfZWdwdCwgInhfcmFuZCIpW1sxXV0KCiMgY3JlYXRlIGEgYmxhbmsgcGxvdCBmaXJzdCB3aXRoIGFwcHJvcHJpYXRlIGxpbWl0cwpwbG90KDEsIDEsIHhsaW09YygwLCA4MDApLCB5bGltPWMoMCwgMTIwMCksIHR5cGU9Im4iLAogICAgIHhsYWIgPSAiRXllIHRyYWNraW5nIHZhbHVlIDEiLCB5bGFiID0gIkV5ZSB0cmFja2luZyB2YWx1ZSAyIiwgbWFpbiA9ICJHbyBQYXN0IFRpbWUiKSAjICd0eXBlID0gIm4iJyBtYWtlcyBzdXJlIHRoZSBwbG90IGlzIGJsYW5rCgojIGFkZCBwb2ludHMgZm9yIHhfcmFuZCB3aXRoIGNvbG9yIApwb2ludHMoZWdwdF9yYW5kWywxXSwgZWdwdF9yYW5kWywyXSwgY29sID0gImJsYWNrIiwgcGNoID0gMTYpCiMgYWRkIHBvaW50cyBmb3IgZ2RfdGVtcCB3aXRoIGNvbG9yIHJlZApwb2ludHMoZWdwdF90ZW1wLCBwY2g9MTYsIGNvbD0icmVkIikKCiMgYWRkIGRhdGFFbGxpcHNlIHdpdGggY29sb3IgCmRhdGFFbGxpcHNlKGVncHRfcmFuZCwgbGV2ZWxzID0gYygwLjUsIDAuNzUpLCBmaWxsPVQsIHBsb3QucG9pbnRzID0gRiwgY29sPSJvcmFuZ2UiKQpkYXRhRWxsaXBzZShlZ3B0X3JhbmQsIGxldmVscyA9IGMoMC45NSwgMC45OSksIGZpbGw9VCwgcGxvdC5wb2ludHMgPSBGLCBjb2w9ImJsdWUiKQoKcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVG90YWwgRHVyYXRpb24tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCmV0ZF9yYW5kIDwtIGV4dHJhY3QoZml0X2V0ZCwgInhfcmFuZCIpW1sxXV0KCiMgY3JlYXRlIGEgYmxhbmsgcGxvdCBmaXJzdCB3aXRoIGFwcHJvcHJpYXRlIGxpbWl0cwpwbG90KDEsIDEsIHhsaW09YygwLCA4MDApLCB5bGltPWMoMCwgMTIwMCksIHR5cGU9Im4iLAogICAgIHhsYWIgPSAiRXllIHRyYWNraW5nIHZhbHVlIDEiLCB5bGFiID0gIkV5ZSB0cmFja2luZyB2YWx1ZSAyIiwgbWFpbiA9ICJUb3RhbCBEdXJhdGlvbiIpICMgJ3R5cGUgPSAibiInIG1ha2VzIHN1cmUgdGhlIHBsb3QgaXMgYmxhbmsKCiMgYWRkIHBvaW50cyBmb3IgeF9yYW5kIHdpdGggY29sb3IgCnBvaW50cyhldGRfcmFuZFssMV0sIGV0ZF9yYW5kWywyXSwgY29sID0gImJsYWNrIiwgcGNoID0gMTYpCiMgYWRkIHBvaW50cyBmb3IgZ2RfdGVtcCB3aXRoIGNvbG9yIHJlZApwb2ludHMoZXRkX3RlbXAsIHBjaD0xNiwgY29sPSJyZWQiKQoKIyBhZGQgZGF0YUVsbGlwc2Ugd2l0aCBjb2xvciAKZGF0YUVsbGlwc2UoZXRkX3JhbmQsIGxldmVscyA9IGMoMC41LCAwLjc1KSwgZmlsbD1ULCBwbG90LnBvaW50cyA9IEYsIGNvbD0ib3JhbmdlIikKZGF0YUVsbGlwc2UoZXRkX3JhbmQsIGxldmVscyA9IGMoMC45NSwgMC45OSksIGZpbGw9VCwgcGxvdC5wb2ludHMgPSBGLCBjb2w9ImJsdWUiKQoKcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmlyc3QgUGFzcyBSZWdyZXNzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKZXJlZ19yYW5kIDwtIGV4dHJhY3QoZml0X2VyZWcsICJ4X3JhbmQiKVtbMV1dCgojIGNyZWF0ZSBhIGJsYW5rIHBsb3QgZmlyc3Qgd2l0aCBhcHByb3ByaWF0ZSBsaW1pdHMKcGxvdCgxLCAxLCB4bGltPWMoMCwgMSksIHlsaW09YygwLCAxKSwgdHlwZT0ibiIsCiAgICAgeGxhYiA9ICJFeWUgdHJhY2tpbmcgdmFsdWUgMSIsIHlsYWIgPSAiRXllIHRyYWNraW5nIHZhbHVlIDIiLCBtYWluID0gIkZpcnN0IFBhc3MgUmVncmVzc2lvbiIpICMgJ3R5cGUgPSAibiInIG1ha2VzIHN1cmUgdGhlIHBsb3QgaXMgYmxhbmsKCiMgYWRkIHBvaW50cyBmb3IgeF9yYW5kIHdpdGggY29sb3IgCnBvaW50cyhlcmVnX3JhbmRbLDFdLCBlcmVnX3JhbmRbLDJdLCBjb2wgPSAiYmxhY2siLCBwY2ggPSAxNikKIyBhZGQgcG9pbnRzIGZvciBnZF90ZW1wIHdpdGggY29sb3IgcmVkCnBvaW50cyhlcmVnX3RlbXAsIHBjaD0xNiwgY29sPSJyZWQiKQoKIyBhZGQgZGF0YUVsbGlwc2Ugd2l0aCBjb2xvciAKZGF0YUVsbGlwc2UoZXJlZ19yYW5kLCBsZXZlbHMgPSBjKDAuNSwgMC43NSksIGZpbGw9VCwgcGxvdC5wb2ludHMgPSBGLCBjb2w9Im9yYW5nZSIpCmRhdGFFbGxpcHNlKGVyZWdfcmFuZCwgbGV2ZWxzID0gYygwLjk1LCAwLjk5KSwgZmlsbD1ULCBwbG90LnBvaW50cyA9IEYsIGNvbD0iYmx1ZSIpCmBgYAoKCiMgQmF5ZXNpYW4gLS0gY29ycmVsYXRpb24gYmV0d2VlbiBNb1RSIGFuZCB3b3JkIGxldmVsIHN0YXRpc3RpY3MKYGBge3J9CnByaW50KCJMb2cgRnJlcXVlbmN5IikKc3RhdHNfY29yX2RmID0gcHJvdm9fZGYgJT4lIGZpbHRlcihtZXRyaWMgPT0gImdhemVfZHVyYXRpb24iKSAlPiUgc3ByZWFkKG1lYXN1cmUsIHZhbHVlKQpwcmludChjb3IudGVzdChzdGF0c19jb3JfZGYkbW90cl92YWx1ZSwgc3RhdHNfY29yX2RmJGZyZXEpJGVzdGltYXRlKQpwcmludChjb3IudGVzdChzdGF0c19jb3JfZGYkZXlldHJfdmFsdWUsIHN0YXRzX2Nvcl9kZiRmcmVxKSRlc3RpbWF0ZSkKCiMgVmlldyhzdGF0c19jb3JfZGYpCnN0YXRzX2Nvcl9kZiAlPiUgCiAgZ2F0aGVyKG1lYXN1cmUsIHZhbHVlLCBjKDcsIDEzKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdmFsdWUpKSArCiAgZ2VvbV9kZW5zaXR5KCkgKwogIGZhY2V0X3dyYXAofm1lYXN1cmUsIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpCgptZnJlcV90ZW1wIDwtIHN0YXRzX2Nvcl9kZltjKCJtb3RyX3ZhbHVlIiwgImZyZXEiKV0gJT4lCiAgZGF0YS5tYXRyaXgoKQplZnJlcV90ZW1wIDwtIHN0YXRzX2Nvcl9kZltjKCJleWV0cl92YWx1ZSIsICJmcmVxIildICU+JQogIGRhdGEubWF0cml4KCkKCiMgU2V0IHVwIHRoZSBwbG90dGluZyBhcmVhIHdpdGggdHdvIHNpZGUtYnktc2lkZSBwbG90cwpwYXIobWZyb3cgPSBjKDEsIDIpKQojIFBsb3QgdGhlIGZpcnN0IGRhdGEgbWF0cml4IGdkX3RlbXAKcGxvdChtZnJlcV90ZW1wLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLAogICAgIG1haW4gPSAiTW9UUiBSVHMgYW5kIFdvcmQgRnJlcXVlbmN5IikKCiMgUGxvdCB0aGUgZmlyc3QgZGF0YSBtYXRyaXggZ2RfdGVtcApwbG90KGVmcmVxX3RlbXAsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsCiAgICAgbWFpbiA9ICJFeWVUUiBSVHMgYW5kIFdvcmQgRnJlcXVlbmN5IikKCmBgYAojIG1vdHIgJiBmcmVxdWVuY3kKYGBge3IsIGV2YWw9RkFMU0V9Cm1mcmVxX2RhdGEgPSBsaXN0KHg9bWZyZXFfdGVtcCwgTj1ucm93KG1mcmVxX3RlbXApKQoKZml0X21mcmVxID0gc3RhbigKICBmaWxlPSJzdGFuX21vZGVscy9zdGF0c19jb3JyZWxhdGlvbi5zdGFuIiwgCiAgZGF0YT1tZnJlcV9kYXRhLCAKICBpdGVyPTQwMDAsIAogIGNoYWlucz00LCAKICBjb3Jlcz04LAogIHNlZWQ9NDQ0LAogICMgY29udHJvbD1saXN0KGFkYXB0X2RlbHRhPTAuOTkpLCAKICAjIHZlcmJvc2UgPSBGQUxTRQogICkKCiMgU2F2ZSB0aGUgbW9kZWwgCmZpdF9tZnJlcUBzdGFubW9kZWxAZHNvIDwtIG5ldygiY3h4ZHNvIikKc2F2ZVJEUyhmaXRfbWZyZXEsIGZpbGUgPSBwYXN0ZTAoIm1vdHJfZnJlcV9jb3IucmRzIikpCmBgYAoKIyBleWV0ciAmIGZyZXF1ZW5jeQpgYGB7ciwgZXZhbD1GQUxTRX0KZWZyZXFfZGF0YSA9IGxpc3QoeD1lZnJlcV90ZW1wLCBOPW5yb3coZWZyZXFfdGVtcCkpCgpmaXRfZWZyZXEgPSBzdGFuKAogIGZpbGU9InN0YW5fbW9kZWxzL3N0YXRzX2NvcnJlbGF0aW9uLnN0YW4iLCAKICBkYXRhPWVmcmVxX2RhdGEsIAogIGl0ZXI9NDAwMCwgCiAgY2hhaW5zPTQsIAogIGNvcmVzPTgsCiAgc2VlZD00NDQsCiAgIyBjb250cm9sPWxpc3QoYWRhcHRfZGVsdGE9MC45OSksIAogICMgdmVyYm9zZSA9IEZBTFNFCiAgKQoKIyBTYXZlIHRoZSBtb2RlbCAKZml0X2VmcmVxQHN0YW5tb2RlbEBkc28gPC0gbmV3KCJjeHhkc28iKQpzYXZlUkRTKGZpdF9lZnJlcSwgZmlsZSA9IHBhc3RlMCgiZXlldHJfZnJlcV9jb3IucmRzIikpCmBgYAoKYGBge3J9CnByaW50KCJMZW5ndGgiKQpzdGF0c19jb3JfZGYgPSBwcm92b19kZiAlPiUgZmlsdGVyKG1ldHJpYyA9PSAiZ2F6ZV9kdXJhdGlvbiIpICU+JSBzcHJlYWQobWVhc3VyZSwgdmFsdWUpCnByaW50KGNvci50ZXN0KHN0YXRzX2Nvcl9kZiRtb3RyX3ZhbHVlLCBzdGF0c19jb3JfZGYkbGVuKSRlc3RpbWF0ZSkKcHJpbnQoY29yLnRlc3Qoc3RhdHNfY29yX2RmJGV5ZXRyX3ZhbHVlLCBzdGF0c19jb3JfZGYkbGVuKSRlc3RpbWF0ZSkKCiMgVmlldyhzdGF0c19jb3JfZGYpCnN0YXRzX2Nvcl9kZiAlPiUgCiAgZ2F0aGVyKG1lYXN1cmUsIHZhbHVlLCBjKDksIDEzKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdmFsdWUpKSArCiAgZ2VvbV9kZW5zaXR5KCkgKwogIGZhY2V0X3dyYXAofm1lYXN1cmUsIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpCgptbGVuX3RlbXAgPC0gc3RhdHNfY29yX2RmW2MoIm1vdHJfdmFsdWUiLCAibGVuIildICU+JQogIGRhdGEubWF0cml4KCkKZWxlbl90ZW1wIDwtIHN0YXRzX2Nvcl9kZltjKCJleWV0cl92YWx1ZSIsICJsZW4iKV0gJT4lCiAgZGF0YS5tYXRyaXgoKQoKIyBTZXQgdXAgdGhlIHBsb3R0aW5nIGFyZWEgd2l0aCB0d28gc2lkZS1ieS1zaWRlIHBsb3RzCnBhcihtZnJvdyA9IGMoMSwgMikpCiMgUGxvdCB0aGUgZmlyc3QgZGF0YSBtYXRyaXggZ2RfdGVtcApwbG90KG1sZW5fdGVtcCwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwKICAgICBtYWluID0gIk1vVFIgUlRzIGFuZCBXb3JkIExlbmd0aCIpCgojIFBsb3QgdGhlIGZpcnN0IGRhdGEgbWF0cml4IGdkX3RlbXAKcGxvdChlbGVuX3RlbXAsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsCiAgICAgbWFpbiA9ICJFeWVUUiBSVHMgYW5kIFdvcmQgTGVuZ3RoIikKYGBgCgojIG1vdHIgJiBsZW5ndGgKYGBge3IsIGV2YWw9RkFMU0V9Cm1sZW5fZGF0YSA9IGxpc3QoeD1tbGVuX3RlbXAsIE49bnJvdyhtbGVuX3RlbXApKQoKZml0X21sZW4gPSBzdGFuKAogIGZpbGU9InN0YW5fbW9kZWxzL3N0YXRzX2NvcnJlbGF0aW9uX2xlbl9ub3JtYWwuc3RhbiIsIAogIGRhdGE9bWxlbl9kYXRhLCAKICBpdGVyPTQwMDAsIAogIGNoYWlucz00LCAKICBjb3Jlcz04LAogIHNlZWQ9NDQ0LAogICMgY29udHJvbD1saXN0KGFkYXB0X2RlbHRhPTAuOTkpLCAKICAjIHZlcmJvc2UgPSBGQUxTRQogICkKCiMgU2F2ZSB0aGUgbW9kZWwgCmZpdF9tbGVuQHN0YW5tb2RlbEBkc28gPC0gbmV3KCJjeHhkc28iKQpzYXZlUkRTKGZpdF9tbGVuLCBmaWxlID0gcGFzdGUwKCJtb3RyX2xlbl9jb3IyLnJkcyIpKQoKYGBgCiMgZXlldHIgJiBsZW5ndGgKYGBge3IsIGV2YWw9RkFMU0V9CmVsZW5fZGF0YSA9IGxpc3QoeD1lbGVuX3RlbXAsIE49bnJvdyhlbGVuX3RlbXApKQoKZml0X2VsZW4gPSBzdGFuKAogIGZpbGU9InN0YW5fbW9kZWxzL3N0YXRzX2NvcnJlbGF0aW9uX2xlbl9ub3JtYWwuc3RhbiIsIAogIGRhdGE9ZWxlbl9kYXRhLCAKICBpdGVyPTQwMDAsIAogIGNoYWlucz00LCAKICBjb3Jlcz04LAogIHNlZWQ9NDQ0LAogICMgY29udHJvbD1saXN0KGFkYXB0X2RlbHRhPTAuOTkpLCAKICAjIHZlcmJvc2UgPSBGQUxTRQogICkKCiMgU2F2ZSB0aGUgbW9kZWwgCmZpdF9lbGVuQHN0YW5tb2RlbEBkc28gPC0gbmV3KCJjeHhkc28iKQpzYXZlUkRTKGZpdF9lbGVuLCBmaWxlID0gcGFzdGUwKCJleWV0cl9sZW5fY29yLnJkcyIpKQpgYGAKCmBgYHtyfQpwcmludCgiU3VycHJpc2FsIikKc3RhdHNfY29yX2RmID0gcHJvdm9fZGYgJT4lIGZpbHRlcihtZXRyaWMgPT0gImdhemVfZHVyYXRpb24iKSAlPiUgc3ByZWFkKG1lYXN1cmUsIHZhbHVlKQpwcmludChjb3IudGVzdChzdGF0c19jb3JfZGYkbW90cl92YWx1ZSwgc3RhdHNfY29yX2RmJHN1cnApJGVzdGltYXRlKQpwcmludChjb3IudGVzdChzdGF0c19jb3JfZGYkZXlldHJfdmFsdWUsIHN0YXRzX2Nvcl9kZiRzdXJwKSRlc3RpbWF0ZSkKCiMgVmlldyhzdGF0c19jb3JfZGYpCnN0YXRzX2Nvcl9kZiAlPiUgCiAgZ2F0aGVyKG1lYXN1cmUsIHZhbHVlLCBjKDgsIDEzKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdmFsdWUpKSArCiAgZ2VvbV9kZW5zaXR5KCkgKwogIGZhY2V0X3dyYXAofm1lYXN1cmUsIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpCgptc3VycF90ZW1wIDwtIHN0YXRzX2Nvcl9kZltjKCJtb3RyX3ZhbHVlIiwgInN1cnAiKV0gJT4lCiAgZGF0YS5tYXRyaXgoKQplc3VycF90ZW1wIDwtIHN0YXRzX2Nvcl9kZltjKCJleWV0cl92YWx1ZSIsICJzdXJwIildICU+JQogIGRhdGEubWF0cml4KCkKCiMgU2V0IHVwIHRoZSBwbG90dGluZyBhcmVhIHdpdGggdHdvIHNpZGUtYnktc2lkZSBwbG90cwpwYXIobWZyb3cgPSBjKDEsIDIpKQojIFBsb3QgdGhlIGZpcnN0IGRhdGEgbWF0cml4IGdkX3RlbXAKcGxvdChtc3VycF90ZW1wLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLAogICAgIG1haW4gPSAiTW9UUiBSVHMgYW5kIFN1cnByaXNhbCIpCgojIFBsb3QgdGhlIGZpcnN0IGRhdGEgbWF0cml4IGdkX3RlbXAKcGxvdChlc3VycF90ZW1wLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLAogICAgIG1haW4gPSAiRXllVFIgUlRzIGFuZCBTdXJwcmlzYWwiKQpgYGAKCiMgbW90ciAmIHN1cnByaXNhbApgYGB7ciwgZXZhbD1GQUxTRX0KbXN1cnBfZGF0YSA9IGxpc3QoeD1tc3VycF90ZW1wLCBOPW5yb3cobXN1cnBfdGVtcCkpCgpmaXRfbXN1cnAgPSBzdGFuKAogIGZpbGU9InN0YW5fbW9kZWxzL3N0YXRzX2NvcnJlbGF0aW9uLnN0YW4iLCAKICBkYXRhPW1zdXJwX2RhdGEsIAogIGl0ZXI9NDAwMCwgCiAgY2hhaW5zPTQsIAogIGNvcmVzPTgsCiAgc2VlZD00NDQsCiAgIyBjb250cm9sPWxpc3QoYWRhcHRfZGVsdGE9MC45OSksIAogICMgdmVyYm9zZSA9IEZBTFNFCiAgKQoKIyBTYXZlIHRoZSBtb2RlbCAKZml0X21zdXJwQHN0YW5tb2RlbEBkc28gPC0gbmV3KCJjeHhkc28iKQpzYXZlUkRTKGZpdF9tc3VycCwgZmlsZSA9IHBhc3RlMCgibW90cl9zdXJwX2Nvci5yZHMiKSkKCmBgYAoKIyBleWV0ciAmIHN1cnByaXNhbApgYGB7ciwgZXZhbD1GQUxTRX0KZXN1cnBfZGF0YSA9IGxpc3QoeD1lc3VycF90ZW1wLCBOPW5yb3coZXN1cnBfdGVtcCkpCgpmaXRfZXN1cnAgPSBzdGFuKAogIGZpbGU9InN0YW5fbW9kZWxzL3N0YXRzX2NvcnJlbGF0aW9uLnN0YW4iLCAKICBkYXRhPWVzdXJwX2RhdGEsIAogIGl0ZXI9NDAwMCwgCiAgY2hhaW5zPTQsIAogIGNvcmVzPTgsCiAgc2VlZD00NDQsCiAgIyBjb250cm9sPWxpc3QoYWRhcHRfZGVsdGE9MC45OSksIAogICMgdmVyYm9zZSA9IEZBTFNFCiAgKQoKIyBTYXZlIHRoZSBtb2RlbCAKZml0X2VzdXJwQHN0YW5tb2RlbEBkc28gPC0gbmV3KCJjeHhkc28iKQpzYXZlUkRTKGZpdF9lc3VycCwgZmlsZSA9IHBhc3RlMCgiZXlldHJfc3VycF9jb3IucmRzIikpCgpgYGAKCgoKCgoKYGBge3J9CmZpdF9tZnJlcSA9IHJlYWRSRFMoIi4vbW90cl9mcmVxX2Nvci5yZHMiKQpmaXRfZWZyZXEgPSByZWFkUkRTKCIuL2V5ZXRyX2ZyZXFfY29yLnJkcyIpCmZpdF9tbGVuID0gcmVhZFJEUygiLi9tb3RyX2xlbl9jb3IucmRzIikKZml0X2VsZW4gPSByZWFkUkRTKCIuL2V5ZXRyX2xlbl9jb3IucmRzIikKZml0X21zdXJwID0gcmVhZFJEUygiLi9tb3RyX3N1cnBfY29yLnJkcyIpCmZpdF9lc3VycCA9IHJlYWRSRFMoIi4vZXlldHJfc3VycF9jb3IucmRzIikKCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1vVFIgJiBMb2cgRnJlcXVlbmN5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKcHJpbnQoZml0X21mcmVxKQpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFeWVUUiAmIExvZyBGcmVxdWVuY3kgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpwcmludChmaXRfZWZyZXEpCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1vVFIgJiBMZW5ndGggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpwcmludChmaXRfbWxlbikKcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRXllVFIgJiBMZW5ndGggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpwcmludChmaXRfZWxlbikKcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTW9UUiAmIFN1cnByaXNhbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCnByaW50KGZpdF9tc3VycCkKcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRXllVFIgJiBTdXJwcmlzYWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpwcmludChmaXRfZXN1cnApCgpgYGAKCmBgYHtyLCBldmFsPUZBTFNFfQojIE1vVFIgJiBMb2cgRnJlcQpzdGFuX3RyYWNlKGZpdF9tZnJlcSkKc3Rhbl9kZW5zKGZpdF9tZnJlcSwgc2VwYXJhdGVfY2hhaW5zID0gVFJVRSkKc3Rhbl9wbG90KGZpdF9tZnJlcSkKCiMgRXllVFIgJiBMb2cgRnJlcQpzdGFuX3RyYWNlKGZpdF9lZnJlcSkKc3Rhbl9kZW5zKGZpdF9lZnJlcSwgc2VwYXJhdGVfY2hhaW5zID0gVFJVRSkKc3Rhbl9wbG90KGZpdF9lZnJlcSkKCiMgTW9UUiAmIExlbgpzdGFuX3RyYWNlKGZpdF9tbGVuKQpzdGFuX2RlbnMoZml0X21sZW4sIHNlcGFyYXRlX2NoYWlucyA9IFRSVUUpCnN0YW5fcGxvdChmaXRfbWxlbikKCiMgRXllVFIgJiBMZW4Kc3Rhbl90cmFjZShmaXRfZWxlbikKc3Rhbl9kZW5zKGZpdF9lbGVuLCBzZXBhcmF0ZV9jaGFpbnMgPSBUUlVFKQpzdGFuX3Bsb3QoZml0X2VsZW4pCgojIE1vVFIgJiBTdXJwcmlzYWwKc3Rhbl90cmFjZShmaXRfbXN1cnApCnN0YW5fZGVucyhmaXRfbXN1cnAsIHNlcGFyYXRlX2NoYWlucyA9IFRSVUUpCnN0YW5fcGxvdChmaXRfbXN1cnApCgojIEV5ZVRSICYgU3VycHJpc2FsCnN0YW5fdHJhY2UoZml0X2VzdXJwKQpzdGFuX2RlbnMoZml0X2VzdXJwLCBzZXBhcmF0ZV9jaGFpbnMgPSBUUlVFKQpzdGFuX3Bsb3QoZml0X2VzdXJwKQoKYGBgCgoKYGBge3J9CnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1vVFIgJiBMb2cgRnJlcSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCnJob19tZnJlcSA9IGFzLm51bWVyaWMoZXh0cmFjdChmaXRfbWZyZXEsICJyaG8iKVtbMV1dKQptZWFuID0gbWVhbihyaG9fbWZyZXEpCmNySSA9IHF1YW50aWxlKHJob19tZnJlcSwgYyguMDI1LCAuOTc1KSkKaHBkOTkgPSBIUERpbnRlcnZhbChhcy5tY21jKHJob19tZnJlcSksIHByb2I9MC45NSkKY2F0KCJNZWFuOiAiLCBtZWFuLCAiXG5IUEQ6IFsiLCBocGQ5OVssImxvd2VyIl0sICIsICIsIGhwZDk5WywidXBwZXIiXSwgIl0iLCBzZXA9IiIsICJcbmNySTogWyIsIGNySVsxXSwgIiwgIiwgY3JJWzJdLCAiXVxuIikKCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEV5ZVRSICYgTG9nIEZyZXEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpyaG9fZWZyZXEgPSBhcy5udW1lcmljKGV4dHJhY3QoZml0X2VmcmVxLCAicmhvIilbWzFdXSkKbWVhbiA9IG1lYW4ocmhvX2VmcmVxKQpjckkgPSBxdWFudGlsZShyaG9fZWZyZXEsIGMoLjAyNSwgLjk3NSkpCmhwZDk5ID0gSFBEaW50ZXJ2YWwoYXMubWNtYyhyaG9fZWZyZXEpLCBwcm9iPTAuOTUpCmNhdCgiTWVhbjogIiwgbWVhbiwgIlxuSFBEOiBbIiwgaHBkOTlbLCJsb3dlciJdLCAiLCAiLCBocGQ5OVssInVwcGVyIl0sICJdIiwgc2VwPSIiLCAiXG5jckk6IFsiLCBjcklbMV0sICIsICIsIGNySVsyXSwgIl1cbiIpCgpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNb1RSICYgTGVuZ3RoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKcmhvX21sZW4gPSBhcy5udW1lcmljKGV4dHJhY3QoZml0X21sZW4sICJyaG8iKVtbMV1dKQptZWFuID0gbWVhbihyaG9fbWxlbikKY3JJID0gcXVhbnRpbGUocmhvX21sZW4sIGMoLjAyNSwgLjk3NSkpCmhwZDk5ID0gSFBEaW50ZXJ2YWwoYXMubWNtYyhyaG9fbWxlbiksIHByb2I9MC45NSkKY2F0KCJNZWFuOiAiLCBtZWFuLCAiXG5IUEQ6IFsiLCBocGQ5OVssImxvd2VyIl0sICIsICIsIGhwZDk5WywidXBwZXIiXSwgIl0iLCBzZXA9IiIsICJcbmNySTogWyIsIGNySVsxXSwgIiwgIiwgY3JJWzJdLCAiXVxuIikKCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEV5ZVRSICYgTGVuZ3RoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKcmhvX2VsZW4gPSBhcy5udW1lcmljKGV4dHJhY3QoZml0X2VsZW4sICJyaG8iKVtbMV1dKQptZWFuID0gbWVhbihyaG9fZWxlbikKY3JJID0gcXVhbnRpbGUocmhvX2VsZW4sIGMoLjAyNSwgLjk3NSkpCmhwZDk5ID0gSFBEaW50ZXJ2YWwoYXMubWNtYyhyaG9fZWxlbiksIHByb2I9MC45NSkKY2F0KCJNZWFuOiAiLCBtZWFuLCAiXG5IUEQ6IFsiLCBocGQ5OVssImxvd2VyIl0sICIsICIsIGhwZDk5WywidXBwZXIiXSwgIl0iLCBzZXA9IiIsICJcbmNySTogWyIsIGNySVsxXSwgIiwgIiwgY3JJWzJdLCAiXVxuIikKCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1vVFIgJiBTdXJwcmlzYWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpyaG9fbXN1cnAgPSBhcy5udW1lcmljKGV4dHJhY3QoZml0X21zdXJwLCAicmhvIilbWzFdXSkKbWVhbiA9IG1lYW4ocmhvX21zdXJwKQpjckkgPSBxdWFudGlsZShyaG9fbXN1cnAsIGMoLjAyNSwgLjk3NSkpCmhwZDk5ID0gSFBEaW50ZXJ2YWwoYXMubWNtYyhyaG9fbXN1cnApLCBwcm9iPTAuOTUpCmNhdCgiTWVhbjogIiwgbWVhbiwgIlxuSFBEOiBbIiwgaHBkOTlbLCJsb3dlciJdLCAiLCAiLCBocGQ5OVssInVwcGVyIl0sICJdIiwgc2VwPSIiLCAiXG5jckk6IFsiLCBjcklbMV0sICIsICIsIGNySVsyXSwgIl1cbiIpCgpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFeWVUUiAmIFN1cnByaXNhbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCnJob19lc3VycCA9IGFzLm51bWVyaWMoZXh0cmFjdChmaXRfZXN1cnAsICJyaG8iKVtbMV1dKQptZWFuID0gbWVhbihyaG9fZXN1cnApCmNySSA9IHF1YW50aWxlKHJob19lc3VycCwgYyguMDI1LCAuOTc1KSkKaHBkOTkgPSBIUERpbnRlcnZhbChhcy5tY21jKHJob19lc3VycCksIHByb2I9MC45NSkKY2F0KCJNZWFuOiAiLCBtZWFuLCAiXG5IUEQ6IFsiLCBocGQ5OVssImxvd2VyIl0sICIsICIsIGhwZDk5WywidXBwZXIiXSwgIl0iLCBzZXA9IiIsICJcbmNySTogWyIsIGNySVsxXSwgIiwgIiwgY3JJWzJdLCAiXSIpCgpgYGAKCgoKYGBge3J9CnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1vVFIgJiBMb2cgRnJlcXVlbmN5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQptZnJlcV9yYW5kIDwtIGV4dHJhY3QoZml0X21mcmVxLCAieF9yYW5kIilbWzFdXQoKIyBjcmVhdGUgYSBibGFuayBwbG90IGZpcnN0IHdpdGggYXBwcm9wcmlhdGUgbGltaXRzCnBsb3QoMSwgMSwgeGxpbT1jKDAsIDgwMCksIHlsaW09YygwLCAxMiksIHR5cGU9Im4iLAogICAgIHhsYWIgPSAiTW9UUiB2YWx1ZSIsIHlsYWIgPSAiTG9nIEZyZXF1ZW5jeSIsIG1haW4gPSAiR2F6ZSBEdXJhdGlvbiIpICMgJ3R5cGUgPSAibiInIG1ha2VzIHN1cmUgdGhlIHBsb3QgaXMgYmxhbmsKCiMgYWRkIHBvaW50cyBmb3IgeF9yYW5kIHdpdGggY29sb3IgCnBvaW50cyhtZnJlcV9yYW5kWywxXSwgbWZyZXFfcmFuZFssMl0sIGNvbCA9ICJibGFjayIsIHBjaCA9IDE2KQojIGFkZCBwb2ludHMgZm9yIGdkX3RlbXAgd2l0aCBjb2xvciByZWQKcG9pbnRzKG1mcmVxX3RlbXAsIHBjaD0xNiwgY29sPSJyZWQiKQoKIyBhZGQgZGF0YUVsbGlwc2Ugd2l0aCBjb2xvciAKZGF0YUVsbGlwc2UobWZyZXFfcmFuZCwgbGV2ZWxzID0gYygwLjUsIDAuNzUpLCBmaWxsPVQsIHBsb3QucG9pbnRzID0gRiwgY29sPSJvcmFuZ2UiKQpkYXRhRWxsaXBzZShtZnJlcV9yYW5kLCBsZXZlbHMgPSBjKDAuOTUsIDAuOTkpLCBmaWxsPVQsIHBsb3QucG9pbnRzID0gRiwgY29sPSJibHVlIikKCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEV5ZVRSICYgTG9nIEZyZXF1ZW5jeS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKZWZyZXFfcmFuZCA8LSBleHRyYWN0KGZpdF9lZnJlcSwgInhfcmFuZCIpW1sxXV0KCiMgY3JlYXRlIGEgYmxhbmsgcGxvdCBmaXJzdCB3aXRoIGFwcHJvcHJpYXRlIGxpbWl0cwpwbG90KDEsIDEsIHhsaW09YygwLCA1MDApLCB5bGltPWMoMCwgMTIpLCB0eXBlPSJuIiwKICAgICB4bGFiID0gIkV5ZSB0cmFja2luZyB2YWx1ZSIsIHlsYWIgPSAiTG9nIEZyZXF1ZW5jeSIsIG1haW4gPSAiR2F6ZSBEdXJhdGlvbiIpICMgJ3R5cGUgPSAibiInIG1ha2VzIHN1cmUgdGhlIHBsb3QgaXMgYmxhbmsKCiMgYWRkIHBvaW50cyBmb3IgeF9yYW5kIHdpdGggY29sb3IgCnBvaW50cyhlZnJlcV9yYW5kWywxXSwgZWZyZXFfcmFuZFssMl0sIGNvbCA9ICJibGFjayIsIHBjaCA9IDE2KQojIGFkZCBwb2ludHMgZm9yIGdkX3RlbXAgd2l0aCBjb2xvciByZWQKcG9pbnRzKGVmcmVxX3RlbXAsIHBjaD0xNiwgY29sPSJyZWQiKQoKIyBhZGQgZGF0YUVsbGlwc2Ugd2l0aCBjb2xvciAKZGF0YUVsbGlwc2UoZWZyZXFfcmFuZCwgbGV2ZWxzID0gYygwLjUsIDAuNzUpLCBmaWxsPVQsIHBsb3QucG9pbnRzID0gRiwgY29sPSJvcmFuZ2UiKQpkYXRhRWxsaXBzZShlZnJlcV9yYW5kLCBsZXZlbHMgPSBjKDAuOTUsIDAuOTkpLCBmaWxsPVQsIHBsb3QucG9pbnRzID0gRiwgY29sPSJibHVlIikKCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1vVFIgJiBMZW5ndGggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQptbGVuX3JhbmQgPC0gZXh0cmFjdChmaXRfbWxlbiwgInhfcmFuZCIpW1sxXV0KIyBtbGVuX3JhbmQKCiMgY3JlYXRlIGEgYmxhbmsgcGxvdCBmaXJzdCB3aXRoIGFwcHJvcHJpYXRlIGxpbWl0cwpwbG90KDEsIDEsIHhsaW09YygwLCA4MDApLCB5bGltPWMoMCwgMjApLCB0eXBlPSJuIiwKICAgICB4bGFiID0gIk1vVFIgdmFsdWUiLCB5bGFiID0gIldvcmQgTGVuZ3RoIiwgbWFpbiA9ICJHYXplIER1cmF0aW9uIikgIyAndHlwZSA9ICJuIicgbWFrZXMgc3VyZSB0aGUgcGxvdCBpcyBibGFuawoKIyBhZGQgcG9pbnRzIGZvciB4X3JhbmQgd2l0aCBjb2xvciAKcG9pbnRzKG1sZW5fcmFuZFssMV0sIG1sZW5fcmFuZFssMl0sIGNvbCA9ICJibGFjayIsIHBjaCA9IDE2KQojIGFkZCBwb2ludHMgZm9yIGdkX3RlbXAgd2l0aCBjb2xvciByZWQKcG9pbnRzKG1sZW5fdGVtcCwgcGNoPTE2LCBjb2w9InJlZCIpCgojIGFkZCBkYXRhRWxsaXBzZSB3aXRoIGNvbG9yIApkYXRhRWxsaXBzZShtbGVuX3JhbmQsIGxldmVscyA9IGMoMC41LCAwLjc1KSwgZmlsbD1ULCBwbG90LnBvaW50cyA9IEYsIGNvbD0ib3JhbmdlIikKZGF0YUVsbGlwc2UobWxlbl9yYW5kLCBsZXZlbHMgPSBjKDAuOTUsIDAuOTkpLCBmaWxsPVQsIHBsb3QucG9pbnRzID0gRiwgY29sPSJibHVlIikKCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEV5ZVRSICYgTGVuZ3RoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKZWxlbl9yYW5kIDwtIGV4dHJhY3QoZml0X2VsZW4sICJ4X3JhbmQiKVtbMV1dCiMgZWxlbl9yYW5kCgojIGNyZWF0ZSBhIGJsYW5rIHBsb3QgZmlyc3Qgd2l0aCBhcHByb3ByaWF0ZSBsaW1pdHMKcGxvdCgxLCAxLCB4bGltPWMoMCwgODAwKSwgeWxpbT1jKDAsIDIwKSwgdHlwZT0ibiIsCiAgICAgeGxhYiA9ICJFeWVUUiB2YWx1ZSIsIHlsYWIgPSAiV29yZCBMZW5ndGgiLCBtYWluID0gIkdhemUgRHVyYXRpb24iKSAjICd0eXBlID0gIm4iJyBtYWtlcyBzdXJlIHRoZSBwbG90IGlzIGJsYW5rCgojIGFkZCBwb2ludHMgZm9yIHhfcmFuZCB3aXRoIGNvbG9yIApwb2ludHMoZWxlbl9yYW5kWywxXSwgZWxlbl9yYW5kWywyXSwgY29sID0gImJsYWNrIiwgcGNoID0gMTYpCiMgYWRkIHBvaW50cyBmb3IgZ2RfdGVtcCB3aXRoIGNvbG9yIHJlZApwb2ludHMoZWxlbl90ZW1wLCBwY2g9MTYsIGNvbD0icmVkIikKCiMgYWRkIGRhdGFFbGxpcHNlIHdpdGggY29sb3IgCmRhdGFFbGxpcHNlKGVsZW5fcmFuZCwgbGV2ZWxzID0gYygwLjUsIDAuNzUpLCBmaWxsPVQsIHBsb3QucG9pbnRzID0gRiwgY29sPSJvcmFuZ2UiKQpkYXRhRWxsaXBzZShlbGVuX3JhbmQsIGxldmVscyA9IGMoMC45NSwgMC45OSksIGZpbGw9VCwgcGxvdC5wb2ludHMgPSBGLCBjb2w9ImJsdWUiKQoKcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTW9UUiAmIFN1cnByaXNhbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCm1zdXJwX3JhbmQgPC0gZXh0cmFjdChmaXRfbXN1cnAsICJ4X3JhbmQiKVtbMV1dCgojIGNyZWF0ZSBhIGJsYW5rIHBsb3QgZmlyc3Qgd2l0aCBhcHByb3ByaWF0ZSBsaW1pdHMKcGxvdCgxLCAxLCB4bGltPWMoMCwgODAwKSwgeWxpbT1jKDAsIDIwKSwgdHlwZT0ibiIsCiAgICAgeGxhYiA9ICJNb1RSIHZhbHVlIiwgeWxhYiA9ICJXb3JkIFN1cnByaXNhbCIsIG1haW4gPSAiR2F6ZSBEdXJhdGlvbiIpICMgJ3R5cGUgPSAibiInIG1ha2VzIHN1cmUgdGhlIHBsb3QgaXMgYmxhbmsKCiMgYWRkIHBvaW50cyBmb3IgeF9yYW5kIHdpdGggY29sb3IgCnBvaW50cyhtc3VycF9yYW5kIFssMV0sIG1zdXJwX3JhbmRbLDJdLCBjb2wgPSAiYmxhY2siLCBwY2ggPSAxNikKIyBhZGQgcG9pbnRzIGZvciBnZF90ZW1wIHdpdGggY29sb3IgcmVkCnBvaW50cyhtc3VycF90ZW1wLCBwY2g9MTYsIGNvbD0icmVkIikKCiMgYWRkIGRhdGFFbGxpcHNlIHdpdGggY29sb3IgCmRhdGFFbGxpcHNlKG1zdXJwX3JhbmQsIGxldmVscyA9IGMoMC41LCAwLjc1KSwgZmlsbD1ULCBwbG90LnBvaW50cyA9IEYsIGNvbD0ib3JhbmdlIikKZGF0YUVsbGlwc2UobXN1cnBfcmFuZCwgbGV2ZWxzID0gYygwLjk1LCAwLjk5KSwgZmlsbD1ULCBwbG90LnBvaW50cyA9IEYsIGNvbD0iYmx1ZSIpCgpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFeWVUUiAmIFN1cnByaXNhbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCmVzdXJwX3JhbmQgPC0gZXh0cmFjdChmaXRfZXN1cnAsICJ4X3JhbmQiKVtbMV1dCgojIGNyZWF0ZSBhIGJsYW5rIHBsb3QgZmlyc3Qgd2l0aCBhcHByb3ByaWF0ZSBsaW1pdHMKcGxvdCgxLCAxLCB4bGltPWMoMCwgODAwKSwgeWxpbT1jKDAsIDIwKSwgdHlwZT0ibiIsCiAgICAgeGxhYiA9ICJFeWVUUiB2YWx1ZSIsIHlsYWIgPSAiV29yZCBTdXJwcmlzYWwiLCBtYWluID0gIkdhemUgRHVyYXRpb24iKSAjICd0eXBlID0gIm4iJyBtYWtlcyBzdXJlIHRoZSBwbG90IGlzIGJsYW5rCgojIGFkZCBwb2ludHMgZm9yIHhfcmFuZCB3aXRoIGNvbG9yIApwb2ludHMoZXN1cnBfcmFuZCBbLDFdLCBlc3VycF9yYW5kWywyXSwgY29sID0gImJsYWNrIiwgcGNoID0gMTYpCiMgYWRkIHBvaW50cyBmb3IgZ2RfdGVtcCB3aXRoIGNvbG9yIHJlZApwb2ludHMoZXN1cnBfdGVtcCwgcGNoPTE2LCBjb2w9InJlZCIpCgojIGFkZCBkYXRhRWxsaXBzZSB3aXRoIGNvbG9yIApkYXRhRWxsaXBzZShlc3VycF9yYW5kLCBsZXZlbHMgPSBjKDAuNSwgMC43NSksIGZpbGw9VCwgcGxvdC5wb2ludHMgPSBGLCBjb2w9Im9yYW5nZSIpCmRhdGFFbGxpcHNlKGVzdXJwX3JhbmQsIGxldmVscyA9IGMoMC45NSwgMC45OSksIGZpbGw9VCwgcGxvdC5wb2ludHMgPSBGLCBjb2w9ImJsdWUiKQoKYGBgCgoKYGBge3J9CnByaW50KCJFeWVUUiB2cy4gRXllVFIgRmlzcnQgUGFzcyBSZWdyZXNzaW9uIFByb2IuIDwgMC4zICIpCgplcmVnX2RmID0gcHJvdm9fZXlldHJfZ3JvdXBlZF9kZiAlPiUgZmlsdGVyKG1ldHJpYyA9PSAiRlBSZWciKSAlPiUgZGlzdGluY3QoKSAlPiUgI2dyb3VwX2J5KHRleHRfaWQsIG1ldHJpYywgbWVhc3VyZSkgJT4lCiAgIyBzdW1tYXJpemUodmFsdWUgPSBtZWFuKHZhbHVlKSkgJT4lCiAgZmlsdGVyKCEocm93X251bWJlcigpICVpbiUgYyg0NDMsIDQ0NCwgNDQ1LCA0NDYpKSkgJT4lCiAgICBzcHJlYWQobWVhc3VyZSwgdmFsdWUpICU+JQogICMgc21vb3RoaW5nLCBpZiBpbmNsdWRlcyAwcwogIG11dGF0ZShleWV0cl92YWx1ZV8xID0gIHBtYXgodmFsdWVfMSwgMWUtNSksCiAgICAgICAgIGV5ZXRyX3ZhbHVlXzIgPSBwbWF4KHZhbHVlXzIsIDFlLTUpKQoKZXJlZ19kZl9sb3cgPSBwcm92b19leWV0cl9ncm91cGVkX2RmICU+JSBmaWx0ZXIobWV0cmljID09ICJGUFJlZyIpICU+JSBkaXN0aW5jdCgpICU+JSAjZ3JvdXBfYnkodGV4dF9pZCwgbWV0cmljLCBtZWFzdXJlKSAlPiUKICAjIHN1bW1hcml6ZSh2YWx1ZSA9IG1lYW4odmFsdWUpKSAlPiUKICBmaWx0ZXIoIShyb3dfbnVtYmVyKCkgJWluJSBjKDQ0MywgNDQ0LCA0NDUsIDQ0NikpKSAlPiUKICAgIHNwcmVhZChtZWFzdXJlLCB2YWx1ZSkgJT4lCiAgIyBzbW9vdGhpbmcsIGlmIGluY2x1ZGVzIDBzCiAgbXV0YXRlKGV5ZXRyX3ZhbHVlXzEgPSAgcG1heCh2YWx1ZV8xLCAxZS01KSwKICAgICAgICAgZXlldHJfdmFsdWVfMiA9IHBtYXgodmFsdWVfMiwgMWUtNSkpICU+JQogIGZpbHRlcihleWV0cl92YWx1ZV8xIDwgMC4zKQojIFZpZXcoZXJlZ19kZl9sb3cpCgplcmVnX2RmX2hpZ2ggPSBwcm92b19leWV0cl9ncm91cGVkX2RmICU+JSBmaWx0ZXIobWV0cmljID09ICJGUFJlZyIpICU+JSBkaXN0aW5jdCgpICU+JSAjZ3JvdXBfYnkodGV4dF9pZCwgbWV0cmljLCBtZWFzdXJlKSAlPiUKICAjIHN1bW1hcml6ZSh2YWx1ZSA9IG1lYW4odmFsdWUpKSAlPiUKICBmaWx0ZXIoIShyb3dfbnVtYmVyKCkgJWluJSBjKDQ0MywgNDQ0LCA0NDUsIDQ0NikpKSAlPiUKICAgIHNwcmVhZChtZWFzdXJlLCB2YWx1ZSkgJT4lCiAgIyBzbW9vdGhpbmcsIGlmIGluY2x1ZGVzIDBzCiAgbXV0YXRlKGV5ZXRyX3ZhbHVlXzEgPSAgcG1heCh2YWx1ZV8xLCAxZS01KSwKICAgICAgICAgZXlldHJfdmFsdWVfMiA9IHBtYXgodmFsdWVfMiwgMWUtNSkpICU+JQogIGZpbHRlcihleWV0cl92YWx1ZV8xID49IDAuMykKIyBWaWV3KGVyZWdfZGZfaGlnaCkgCgpwcmludChjb3IudGVzdChlcmVnX2RmJGV5ZXRyX3ZhbHVlXzEsIGVyZWdfZGYkZXlldHJfdmFsdWVfMikkZXN0aW1hdGUpCnByaW50KGNvci50ZXN0KGVyZWdfZGYkZXlldHJfdmFsdWVfMSwgZXJlZ19kZiRleWV0cl92YWx1ZV8yKSRwLnZhbHVlKQpwcmludChjb3IudGVzdChlcmVnX2RmX2xvdyRleWV0cl92YWx1ZV8xLCBlcmVnX2RmX2xvdyRleWV0cl92YWx1ZV8yKSRlc3RpbWF0ZSkKcHJpbnQoY29yLnRlc3QoZXJlZ19kZl9sb3ckZXlldHJfdmFsdWVfMSwgZXJlZ19kZl9sb3ckZXlldHJfdmFsdWVfMikkcC52YWx1ZSkKcHJpbnQoY29yLnRlc3QoZXJlZ19kZl9oaWdoJGV5ZXRyX3ZhbHVlXzEsIGVyZWdfZGZfaGlnaCRleWV0cl92YWx1ZV8yKSRlc3RpbWF0ZSkKcHJpbnQoY29yLnRlc3QoZXJlZ19kZl9oaWdoJGV5ZXRyX3ZhbHVlXzEsIGVyZWdfZGZfaGlnaCRleWV0cl92YWx1ZV8yKSRwLnZhbHVlKQoKIyBWaWV3KGVnZF9kZikKCmVyZWdfZGYgJT4lIAogIGdhdGhlcihtZWFzdXJlLCB2YWx1ZSwgNTo2KSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB2YWx1ZSkpICsKICBnZW9tX2RlbnNpdHkoKSArCiAgZmFjZXRfd3JhcCh+bWVhc3VyZSwgc2NhbGVzID0gImZyZWUiKSArCiAgdGhlbWVfYncoKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQxIikKCmVyZWdfdGVtcCA8LSBlcmVnX2RmW2MoImV5ZXRyX3ZhbHVlXzEiLCAiZXlldHJfdmFsdWVfMiIpXSAlPiUKICBkcm9wX25hKCkgJT4lCiAgZGF0YS5tYXRyaXgoKQplcmVnX3RlbXBfbG93IDwtIGVyZWdfZGZfbG93W2MoImV5ZXRyX3ZhbHVlXzEiLCAiZXlldHJfdmFsdWVfMiIpXSAlPiUKICBkcm9wX25hKCkgJT4lCiAgZGF0YS5tYXRyaXgoKQplcmVnX3RlbXBfaGlnaCA8LSBlcmVnX2RmX2hpZ2hbYygiZXlldHJfdmFsdWVfMSIsICJleWV0cl92YWx1ZV8yIildICU+JQogIGRyb3BfbmEoKSAlPiUKICBkYXRhLm1hdHJpeCgpCgojIFNldCB1cCB0aGUgcGxvdHRpbmcgYXJlYSB3aXRoIHR3byBzaWRlLWJ5LXNpZGUgcGxvdHMKcGFyKG1mcm93ID0gYygxLCAzKSkKIyBQbG90IHRoZSBmaXJzdCBkYXRhIG1hdHJpeCBnZF90ZW1wCnBsb3QoZXJlZ190ZW1wLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLAogICAgIG1haW4gPSAiRlBSZWcgYWxsIGRhdGEgTm90IExvZy1UcmFuc2Zvcm1lZCIpCnBsb3QoZXJlZ190ZW1wX2xvdywgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwKICAgICBtYWluID0gIkZQUmVnIDwgMC4zIE5vdCBMb2ctVHJhbnNmb3JtZWQiKQpwbG90KGVyZWdfdGVtcF9oaWdoLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLAogICAgIG1haW4gPSAiRlBSZWcgPiAwLjMgTm90IExvZy1UcmFuc2Zvcm1lZCIpCmBgYAoKCmBgYHtyLCBldmFsPUZBTFNFfQojIC0tLS0tLS1maXQgbW9kZWwgZXlldHIgdnMuIGV5ZXRyIEZQUmVnIDwwLjMgJiA+PTAuMyAtLS0tLS0tLS0tCnJlZ19kYXRhID0gbGlzdCh4PWVyZWdfdGVtcCwgTj1ucm93KGVyZWdfdGVtcCkpCmZpdF9yZWcgPSBzdGFuKAogICMgZmlsZT0ic3Rhbl9tb2RlbHMvYml2YXJpYXRlX2JldGFfY29ycmVsYXRpb25fcmVnLnN0YW4iLCAKICBmaWxlID0gInN0YW5fbW9kZWxzL2JpdmFyaWF0ZV9ub3JtYWxfcmVnLnN0YW4iLAogIGRhdGE9cmVnX2RhdGEsIAogIGl0ZXI9NDAwMCwgCiAgY2hhaW5zPTQsIAogIGNvcmVzPTQsCiAgc2VlZD00NDQsCiAgIyBjb250cm9sPWxpc3QoYWRhcHRfZGVsdGE9MC45OSksIAogIHZlcmJvc2UgPSBGQUxTRQogICkKCiMgU2F2ZSB0aGUgbW9kZWwgCmZpdF9yZWdAc3Rhbm1vZGVsQGRzbyA8LSBuZXcoImN4eGRzbyIpCnNhdmVSRFMoZml0X3JlZywgZmlsZSA9IHBhc3RlMCgiZXlldHJfZXlldHJfRlBSZWdfY29yX2FsbF9kYXRhLnJkcyIpKQpgYGAKCmBgYHtyfQojIGZpdF9lcmVnX2FsbCA9IHJlYWRSRFMoIi4vZXlldHJfZXlldHJfRlBSZWdfY29yX2FsbF9kYXRhLnJkcyIpCmZpdF9lcmVnX2FsbCA9IHJlYWRSRFMoIi4vLi9leWV0cl9leWV0cl9GUFJlZ19jb3IucmRzIikKZml0X2VyZWdfbG93ID0gcmVhZFJEUygiLi9leWV0cl9leWV0cl9GUFJlZ19jb3JfMDAtMDMucmRzIikKZml0X2VyZWdfaGlnaCA9IHJlYWRSRFMoIi4vZXlldHJfZXlldHJfRlBSZWdfY29yXzAzLTEucmRzIikKCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpcnN0IFBhc3MgUmVncmVzc2lvbiBQcm9iLiBhbGwgZGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCnByaW50KGZpdF9lcmVnX2FsbCkKcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmlyc3QgUGFzcyBSZWdyZXNzaW9uIFByb2IuPCAwLjMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCnByaW50KGZpdF9lcmVnX2xvdykKcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmlyc3QgUGFzcyBSZWdyZXNzaW9uIFByb2IuPj0gMC4zLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpwcmludChmaXRfZXJlZ19oaWdoKQoKYGBgCgoKYGBge3J9CiMgIyBGUFJlZyBhbGwgZGF0YQpzdGFuX3RyYWNlKGZpdF9lcmVnX2FsbCkKc3Rhbl9kZW5zKGZpdF9lcmVnX2FsbCwgc2VwYXJhdGVfY2hhaW5zID0gVFJVRSkKc3Rhbl9wbG90KGZpdF9lcmVnX2FsbCkKCiMgIyBGUFJlZyA8IDAuMwpzdGFuX3RyYWNlKGZpdF9lcmVnX2xvdykKc3Rhbl9kZW5zKGZpdF9lcmVnX2xvdywgc2VwYXJhdGVfY2hhaW5zID0gVFJVRSkKc3Rhbl9wbG90KGZpdF9lcmVnX2xvdykKCiMgRlBSZWcgPj0gMC4zCnN0YW5fdHJhY2UoZml0X2VyZWdfaGlnaCkKc3Rhbl9kZW5zKGZpdF9lcmVnX2hpZ2gsIHNlcGFyYXRlX2NoYWlucyA9IFRSVUUpCnN0YW5fcGxvdChmaXRfZXJlZ19oaWdoKQpgYGAKCmBgYHtyfQpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaXJzdCBQYXNzIFJlZ3Jlc3Npb24gYWxsIGRhdGEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCnJob19lcmVnX2FsbCA9IGFzLm51bWVyaWMoZXh0cmFjdChmaXRfZXJlZ19hbGwsICJyaG8iKVtbMV1dKQptZWFuID0gbWVhbihyaG9fZXJlZ19hbGwpCmNySSA9IHF1YW50aWxlKHJob19lcmVnX2FsbCwgYyguMDI1LCAuOTc1KSkKaHBkOTkgPSBIUERpbnRlcnZhbChhcy5tY21jKHJob19lcmVnX2FsbCksIHByb2I9MC45NSkKY2F0KCJNZWFuOiAiLCBtZWFuLCAiXG5IUEQ6IFsiLCBocGQ5OVssImxvd2VyIl0sICIsICIsIGhwZDk5WywidXBwZXIiXSwgIl0iLCBzZXA9IiIsICJcbmNySTogWyIsIGNySVsxXSwgIiwgIiwgY3JJWzJdLCAiXVxuIikKCgpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaXJzdCBQYXNzIFJlZ3Jlc3Npb24gPCAwLjMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCnJob19lcmVnX2xvdyA9IGFzLm51bWVyaWMoZXh0cmFjdChmaXRfZXJlZ19sb3csICJyaG8iKVtbMV1dKQptZWFuID0gbWVhbihyaG9fZXJlZ19sb3cpCmNySSA9IHF1YW50aWxlKHJob19lcmVnX2xvdywgYyguMDI1LCAuOTc1KSkKaHBkOTkgPSBIUERpbnRlcnZhbChhcy5tY21jKHJob19lcmVnX2xvdyksIHByb2I9MC45NSkKY2F0KCJNZWFuOiAiLCBtZWFuLCAiXG5IUEQ6IFsiLCBocGQ5OVssImxvd2VyIl0sICIsICIsIGhwZDk5WywidXBwZXIiXSwgIl0iLCBzZXA9IiIsICJcbmNySTogWyIsIGNySVsxXSwgIiwgIiwgY3JJWzJdLCAiXVxuIikKCgpwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaXJzdCBQYXNzIFJlZ3Jlc3Npb24gPj0gMC4zLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQpyaG9fZXJlZ19oaWdoID0gYXMubnVtZXJpYyhleHRyYWN0KGZpdF9lcmVnX2hpZ2gsICJyaG8iKVtbMV1dKQptZWFuID0gbWVhbihyaG9fZXJlZ19oaWdoKQpjckkgPSBxdWFudGlsZShyaG9fZXJlZ19oaWdoLCBjKC4wMjUsIC45NzUpKQpocGQ5OSA9IEhQRGludGVydmFsKGFzLm1jbWMocmhvX2VyZWdfaGlnaCksIHByb2I9MC45NSkKY2F0KCJNZWFuOiAiLCBtZWFuLCAiXG5IUEQ6IFsiLCBocGQ5OVssImxvd2VyIl0sICIsICIsIGhwZDk5WywidXBwZXIiXSwgIl0iLCBzZXA9IiIsICJcbmNySTogWyIsIGNySVsxXSwgIiwgIiwgY3JJWzJdLCAiXVxuIikKYGBgCgpgYGB7cn0KcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmlyc3QgUGFzcyBSZWdyZXNzaW9uIGFsbCBkYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKZWFsbHJlZ19yYW5kIDwtIGV4dHJhY3QoZml0X2VyZWdfYWxsLCAieF9yYW5kIilbWzFdXQojIGNyZWF0ZSBhIGJsYW5rIHBsb3QgZmlyc3Qgd2l0aCBhcHByb3ByaWF0ZSBsaW1pdHMKcGxvdCgxLCAxLCB4bGltPWMoMCwgMSksIHlsaW09YygwLCAxKSwgdHlwZT0ibiIsCiAgICAgeGxhYiA9ICJFeWUgdHJhY2tpbmcgdmFsdWUiLCB5bGFiID0gIk1vVFIgdmFsdWUiLCBtYWluID0gIkZQUmVnIikgIyAndHlwZSA9ICJuIicgbWFrZXMgc3VyZSB0aGUgcGxvdCBpcyBibGFuawoKIyBhZGQgcG9pbnRzIGZvciB4X3JhbmQgd2l0aCBjb2xvciAKcG9pbnRzKGVhbGxyZWdfcmFuZFssMV0sIGVhbGxyZWdfcmFuZFssMl0sIGNvbCA9ICJibGFjayIsIHBjaCA9IDE2KQojIGFkZCBwb2ludHMgZm9yIGdkX3RlbXAgd2l0aCBjb2xvciByZWQKcG9pbnRzKGVyZWdfdGVtcCwgcGNoPTE2LCBjb2w9InJlZCIpCgojIGFkZCBkYXRhRWxsaXBzZSB3aXRoIGNvbG9yIApkYXRhRWxsaXBzZShlYWxscmVnX3JhbmQsIGxldmVscyA9IGMoMC41LCAwLjc1KSwgZmlsbD1ULCBwbG90LnBvaW50cyA9IEYsIGNvbD0ib3JhbmdlIikKZGF0YUVsbGlwc2UoZWFsbHJlZ19yYW5kLCBsZXZlbHMgPSBjKDAuOTUsIDAuOTkpLCBmaWxsPVQsIHBsb3QucG9pbnRzID0gRiwgY29sPSJibHVlIikKCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpcnN0IFBhc3MgUmVncmVzc2lvbiA8IDAuMyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCmVsb3dyZWdfcmFuZCA8LSBleHRyYWN0KGZpdF9lcmVnX2xvdywgInhfcmFuZCIpW1sxXV0KIyBwcmludChlbG93cmVnX3JhbmQpCiMgY3JlYXRlIGEgYmxhbmsgcGxvdCBmaXJzdCB3aXRoIGFwcHJvcHJpYXRlIGxpbWl0cwpwbG90KDEsIDEsIHhsaW09YygwLCAxKSwgeWxpbT1jKDAsIDEpLCB0eXBlPSJuIiwKICAgICB4bGFiID0gIkV5ZSB0cmFja2luZyB2YWx1ZSIsIHlsYWIgPSAiTW9UUiB2YWx1ZSIsIG1haW4gPSAiRlBSZWciKSAjICd0eXBlID0gIm4iJyBtYWtlcyBzdXJlIHRoZSBwbG90IGlzIGJsYW5rCgojIGFkZCBwb2ludHMgZm9yIHhfcmFuZCB3aXRoIGNvbG9yIApwb2ludHMoZWxvd3JlZ19yYW5kWywxXSwgZWxvd3JlZ19yYW5kWywyXSwgY29sID0gImJsYWNrIiwgcGNoID0gMTYpCiMgYWRkIHBvaW50cyBmb3IgZ2RfdGVtcCB3aXRoIGNvbG9yIHJlZApwb2ludHMoZXJlZ190ZW1wX2xvdywgcGNoPTE2LCBjb2w9InJlZCIpCgojIGFkZCBkYXRhRWxsaXBzZSB3aXRoIGNvbG9yIApkYXRhRWxsaXBzZShlbG93cmVnX3JhbmQsIGxldmVscyA9IGMoMC41LCAwLjc1KSwgZmlsbD1ULCBwbG90LnBvaW50cyA9IEYsIGNvbD0ib3JhbmdlIikKZGF0YUVsbGlwc2UoZWxvd3JlZ19yYW5kLCBsZXZlbHMgPSBjKDAuOTUsIDAuOTkpLCBmaWxsPVQsIHBsb3QucG9pbnRzID0gRiwgY29sPSJibHVlIikKCnByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpcnN0IFBhc3MgUmVncmVzc2lvbiA+PSAwLjMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQplaGlnaHJlZ19yYW5kX3NhbXBsZXMgPC0gZXh0cmFjdChmaXRfZXJlZ19oaWdoLCAieF9yYW5kIilbWzFdXQojIHByaW50KG1oaWdocmVnX3JhbmRfc2FtcGxlcykKc2VsZWN0ZWRfaW5kaWNlcyA8LSBzYW1wbGUoMTpucm93KGVoaWdocmVnX3JhbmRfc2FtcGxlcyksIDkwMCkKZWhpZ2hyZWdfcmFuZCA8LSBlaGlnaHJlZ19yYW5kX3NhbXBsZXNbc2VsZWN0ZWRfaW5kaWNlcywgXQojIG1oaWdocmVnX3JhbmQgPC0gZXh0cmFjdChmaXRfbXJlZ19oaWdoLCAieF9yYW5kIilbWzFdXQojIGNyZWF0ZSBhIGJsYW5rIHBsb3QgZmlyc3Qgd2l0aCBhcHByb3ByaWF0ZSBsaW1pdHMKcGxvdCgxLCAxLCB4bGltPWMoMCwgMSksIHlsaW09YygwLCAxKSwgdHlwZT0ibiIsCiAgICAgeGxhYiA9ICJFeWUgdHJhY2tpbmcgdmFsdWUiLCB5bGFiID0gIk1vVFIgdmFsdWUiLCBtYWluID0gIkZQUmVnIikgIyAndHlwZSA9ICJuIicgbWFrZXMgc3VyZSB0aGUgcGxvdCBpcyBibGFuawoKIyBhZGQgcG9pbnRzIGZvciB4X3JhbmQgd2l0aCBjb2xvciAKcG9pbnRzKGVoaWdocmVnX3JhbmRbLDFdLCBlaGlnaHJlZ19yYW5kWywyXSwgY29sID0gImJsYWNrIiwgcGNoID0gMTYpCiMgYWRkIHBvaW50cyBmb3IgZ2RfdGVtcCB3aXRoIGNvbG9yIHJlZApwb2ludHMoZXJlZ190ZW1wX2hpZ2gsIHBjaD0xNiwgY29sPSJyZWQiKQoKIyBhZGQgZGF0YUVsbGlwc2Ugd2l0aCBjb2xvciAKZGF0YUVsbGlwc2UoZWhpZ2hyZWdfcmFuZCwgbGV2ZWxzID0gYygwLjUsIDAuNzUpLCBmaWxsPVQsIHBsb3QucG9pbnRzID0gRiwgY29sPSJvcmFuZ2UiKQpkYXRhRWxsaXBzZShlaGlnaHJlZ19yYW5kLCBsZXZlbHMgPSBjKDAuOTUsIDAuOTkpLCBmaWxsPVQsIHBsb3QucG9pbnRzID0gRiwgY29sPSJibHVlIikKCmBgYAoKCgo=